Имеется работающее приложения на ATL. При попытки перевести его в службу путем замены класса CAtlExeModuleT на CAtlServiceModuleT приложение встает на создании СОМ — объекта.
Останавливается на операторе
Данный оператор не возвращает управление, делает вызов и все. При использовании CAtlExeModuleT объект создается.
Где искать ошибку, в каком направлении.
Лучше вообще не заморачивайся поначалу с секьюрити. Пусть по умолчанию всё стоит.
Посмотри настройки бехопасности твоего сервера через dcomcnfg.
Запускай сервис под LocalSystem. Попробуй поставить флаг "разрешить взаимодействие
с рабочим столом". Может он поможет выявить причину.
Здравствуйте, kozlov, Вы писали:
K>Данный оператор не возвращает управление, делает вызов и все. При использовании CAtlExeModuleT объект создается. K>Где искать ошибку, в каком направлении.
проверь, как зарегистрирован COM сервер в ключе HKCR\AppID\{AppID сервера}
должно быть задано значение
Здравствуйте, Ivan, Вы писали:
I>Здравствуйте, kozlov, Вы писали:
K>>Данный оператор не возвращает управление, делает вызов и все. При использовании CAtlExeModuleT объект создается. K>>Где искать ошибку, в каком направлении.
I>проверь, как зарегистрирован COM сервер в ключе HKCR\AppID\{AppID сервера} I>должно быть задано значение
I>LocalService = {Имя сервиса}
K>Лучше вообще не заморачивайся поначалу с секьюрити. Пусть по умолчанию всё стоит. K>Посмотри настройки бехопасности твоего сервера через dcomcnfg. K>Запускай сервис под LocalSystem. Попробуй поставить флаг "разрешить взаимодействие K>с рабочим столом". Может он поможет выявить причину.
т.е. этот код вряд ли совместим с выполнением под управлением srvany.exe
можно попробовать 2 вещи
— убрать LocalService из реестра
— сделать приложение полноценным сервисом и запускать без srvany
Здравствуйте, 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 находиться в другом модуле.
Если запустить любое приложение, использующее данный интерфейс то все проходит нормально. Но ведь до сервиса приложения не запускаються.
Здравствуйте, Ivan, Вы писали:
I>Здравствуйте, kozlov, Вы писали:
K>>Значение стоит K>>LocalService = Брокер заказов
I>CAtlServiceModuleT читает из этого ключа и если он находит там это значение, то пытается вызвать I>
I>т.е. этот код вряд ли совместим с выполнением под управлением srvany.exe I>можно попробовать 2 вещи I>- убрать LocalService из реестра I>- сделать приложение полноценным сервисом и запускать без srvany
Как раз и пытаюсь сделать приложение нормальным сервисом. Srvany использовал только чтобы попробовать.
Приведенный вами фрагмент из CAtlServiceModuleT выполняется успешно. Проблемы возникают позже, когда в сервисе создаеться СОМ. Ф-я CoCreateInstanceEx не возвращает управление. Если бы она отматерила, то была бы информация для поиска ошибки. А так не понятно где искать.
Здравствуйте, kozlov, Вы писали:
K>Приведенный вами фрагмент из CAtlServiceModuleT выполняется успешно.
Если я правильно понимаю описанную ситуацию, то сервис запускается через srvany, а затем пытается вызвать StartServiceCtrlDispatcher -> ServiceMain SCM'ом вызвана не будет (она уже была вызвана у srvany) и, соотвественно, не будет потока, способного обрабатывать входящие COM-вызовы от клиентов