COM & Service NT
От: kozlov  
Дата: 06.04.04 08:07
Оценка:
Hi ALL!

Имеется работающее приложения на ATL. При попытки перевести его в службу путем замены класса CAtlExeModuleT на CAtlServiceModuleT приложение встает на создании СОМ — объекта.
Останавливается на операторе


        hr = CoCreateInstanceEx (CLSID_TPromServer, NULL, CLSCTX_ALL, NULL,  1, &QI);

Данный оператор не возвращает управление, делает вызов и все. При использовании CAtlExeModuleT объект создается.
Где искать ошибку, в каком направлении.
Re: COM & Service NT
От: kiamor  
Дата: 06.04.04 08:15
Оценка:
Здравствуйте, kozlov.

Как у тебя там с правами на доступ и запуск COM-сервера? Сервис — хитрый зверёк.
Re[2]: COM & Service NT
От: kozlov  
Дата: 06.04.04 08:25
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Как у тебя там с правами на доступ и запуск COM-сервера? Сервис — хитрый зверёк.


На этом сайте нашел рекомендацию на момент отладки поставить CoInitializeSecurity с нулями. Вставил
CoInitializeSecurity(0, 0, 0, 0, 0, 0, 0, 0, 0) ;

Ничего не изменилось. Но если бы не было прав то мне бы вернулся код ошибки.
В сервисе вхожу под отладчик посредством DebugBreak() ;
Re[3]: COM & Service NT
От: kiamor  
Дата: 06.04.04 08:31
Оценка:
Здравствуйте, kozlov.

Лучше вообще не заморачивайся поначалу с секьюрити. Пусть по умолчанию всё стоит.
Посмотри настройки бехопасности твоего сервера через dcomcnfg.
Запускай сервис под LocalSystem. Попробуй поставить флаг "разрешить взаимодействие
с рабочим столом". Может он поможет выявить причину.
Re[2]: COM & Service NT
От: kozlov  
Дата: 06.04.04 08:33
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Как у тебя там с правами на доступ и запуск COM-сервера? Сервис — хитрый зверёк.


Дополнение.
Пока я не переделал код под сервис он выполнялся в качестве сервиса через утилиту SrvAny.exe
Re: COM & Service NT
От: Ivan Россия www.rsdn.ru
Дата: 06.04.04 08:37
Оценка:
Здравствуйте, kozlov, Вы писали:

K>Данный оператор не возвращает управление, делает вызов и все. При использовании CAtlExeModuleT объект создается.

K>Где искать ошибку, в каком направлении.

проверь, как зарегистрирован COM сервер в ключе HKCR\AppID\{AppID сервера}
должно быть задано значение

LocalService = {Имя сервиса}
Re[2]: COM & Service NT
От: kozlov  
Дата: 06.04.04 08:48
Оценка:
Здравствуйте, Ivan, Вы писали:

I>Здравствуйте, kozlov, Вы писали:


K>>Данный оператор не возвращает управление, делает вызов и все. При использовании CAtlExeModuleT объект создается.

K>>Где искать ошибку, в каком направлении.

I>проверь, как зарегистрирован COM сервер в ключе HKCR\AppID\{AppID сервера}

I>должно быть задано значение

I>LocalService = {Имя сервиса}



Значение стоит
LocalService = Брокер заказов
Re[4]: COM & Service NT
От: kozlov  
Дата: 06.04.04 08:50
Оценка:
Здравствуйте, kiamor, Вы писали:


K>Лучше вообще не заморачивайся поначалу с секьюрити. Пусть по умолчанию всё стоит.

K>Посмотри настройки бехопасности твоего сервера через dcomcnfg.
K>Запускай сервис под LocalSystem. Попробуй поставить флаг "разрешить взаимодействие
K>с рабочим столом". Может он поможет выявить причину.

Не помогает!
Re[5]: COM & Service NT
От: kiamor  
Дата: 06.04.04 09:01
Оценка:
Здравствуйте, kozlov.

Давай-ка поподробней. Откуда ты пытаешься создать COM-объект?
Из сервиса? Из отдельного приложения? Не очень понятно.
Re[3]: COM & Service NT
От: Ivan Россия www.rsdn.ru
Дата: 06.04.04 09:22
Оценка:
Здравствуйте, kozlov, Вы писали:


K>Значение стоит

K>LocalService = Брокер заказов

CAtlServiceModuleT читает из этого ключа и если он находит там это значение, то пытается вызвать
            SERVICE_TABLE_ENTRY st[] =
            {
                { m_szServiceName, _ServiceMain },
                { NULL, NULL }
            };
            if (::StartServiceCtrlDispatcher(st) == 0)
                m_status.dwWin32ExitCode = GetLastError();

т.е. этот код вряд ли совместим с выполнением под управлением srvany.exe
можно попробовать 2 вещи
— убрать LocalService из реестра
— сделать приложение полноценным сервисом и запускать без srvany
Re[6]: COM & Service NT
От: kozlov  
Дата: 06.04.04 09:37
Оценка:
Здравствуйте, kiamor, Вы писали:

K>Здравствуйте, kozlov.


K>Давай-ка поподробней. Откуда ты пытаешься создать COM-объект?

K>Из сервиса? Из отдельного приложения? Не очень понятно.


Немного истории.
Приложение создавал на VC7 с помощью ATL Proiect Wizard. Установил Server Type в Exutable.
Отладился, после этого стал переводить приложение в нормальный сервис. Посмотрел отличия классов
CAtlExeModuleT и CAtlServiceModuleT. Основное отличие в том что метод Run в CAtlExeModuleT выполнется в основном потоке (просессе). В CAtlServiceModuleT метод Run регистрируется как служба а восновном потоке работает обработчик
CAtlServiceModuleT::Handler. Подменил класс и при попытки запустить кончалось время запуска 30 сек. Стал разбираться и вышел на то что при создании COM — объекта ф-ия
hr = CoCreateInstanceEx (CLSID_TPromServer, NULL, CLSCTX_ALL /*CLSCTX_SERVER*/, NULL,
1, &QI);

не возвращает управление.

Поставил перед ней, чтобы сервис не завершал работу

SetServiceStatus(SERVICE_RUNNING);

После этого сервис не останавливаеться, но создание СОМа не возвращает управление.
Интерфейс ITPromServer находиться в другом модуле.
Если запустить любое приложение, использующее данный интерфейс то все проходит нормально. Но ведь до сервиса приложения не запускаються.
Re[4]: COM & Service NT
От: kozlov  
Дата: 06.04.04 09:48
Оценка:
Здравствуйте, Ivan, Вы писали:

I>Здравствуйте, kozlov, Вы писали:



K>>Значение стоит

K>>LocalService = Брокер заказов

I>CAtlServiceModuleT читает из этого ключа и если он находит там это значение, то пытается вызвать

I>
I>            SERVICE_TABLE_ENTRY st[] =
I>            {
I>                { m_szServiceName, _ServiceMain },
I>                { NULL, NULL }
I>            };
I>            if (::StartServiceCtrlDispatcher(st) == 0)
I>                m_status.dwWin32ExitCode = GetLastError();

I>

I>т.е. этот код вряд ли совместим с выполнением под управлением srvany.exe
I>можно попробовать 2 вещи
I>- убрать LocalService из реестра
I>- сделать приложение полноценным сервисом и запускать без srvany

Как раз и пытаюсь сделать приложение нормальным сервисом. Srvany использовал только чтобы попробовать.
Приведенный вами фрагмент из CAtlServiceModuleT выполняется успешно. Проблемы возникают позже, когда в сервисе создаеться СОМ. Ф-я CoCreateInstanceEx не возвращает управление. Если бы она отматерила, то была бы информация для поиска ошибки. А так не понятно где искать.
Re[5]: COM & Service NT
От: Ivan Россия www.rsdn.ru
Дата: 06.04.04 12:12
Оценка:
Здравствуйте, kozlov, Вы писали:

K>Приведенный вами фрагмент из CAtlServiceModuleT выполняется успешно.

Если я правильно понимаю описанную ситуацию, то сервис запускается через srvany, а затем пытается вызвать StartServiceCtrlDispatcher -> ServiceMain SCM'ом вызвана не будет (она уже была вызвана у srvany) и, соотвественно, не будет потока, способного обрабатывать входящие COM-вызовы от клиентов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.