Служба ATL с _ATL_NO_COM_SUPPORT не запускается
Эта статья поможет устранить проблему, из-за которой мастер проектов активной библиотеки шаблонов (ATL) не запускается как служба после создания проекта службы ATL по умолчанию.
Исходная версия продукта: Visual Studio 2010
Исходный номер базы знаний: 2480736
Симптомы
После создания проекта службы ATL по умолчанию с помощью мастера проектов ATL необходимо зарегистрировать службу с параметром командной /Service
строки, а затем попытаться запустить службу с net start
помощью . Служба запускается, а затем немедленно завершает работу со следующим сообщением:
Не удалось запустить службу
c:\>net start ATLService
The ATLService service is starting........
The ATLService service could not be started.
The service did not report an error.
Причина
Библиотеки базового класса службы ATL не вызывают метод SetServiceStatus
Win32 (SERVICE_RUNNING), если в службе не реализованы объекты COM-модели ATL.
Решение
Служба ATL в основном предназначена как узел службы для объектов COM, поэтому ожидается, что разработчик будет добавлять COM-объекты в службу.
Однако можно использовать ATL без COM. Например, существует _ATL_NO_COM_SUPPORT
макрос, который можно определить, который отключит большую часть поддержки регистрации и реализации COM-объектов в библиотеке ATL.
Из-за ошибки в базовых классах службы, если _ATL_NO_COM_SUPPORT
определен, SetServiceStatus
вызов (SERVICE_RUNNING) не выполняется, и служба запустится, а затем немедленно завершит работу.
Эту ошибку можно обойти, переопределив функцию PreMessageLoop
в CAtlServiceModule
производном классе и вызвав SetServiceStatus
:
HRESULT PreMessageLoop(int nShowCmd)
{
SetServiceStatus(SERVICE_RUNNING);
return __super::PreMessageLoop(nShowCmd);
}
Примечание.
Это PreMessageLoop
переопределение относится только к определенным службам _ATL_NO_COM_SUPPORT
ATL.
Дополнительная информация
Создайте проект ATL с помощью мастера проектов.
Назовите проект ATLService и в разделе Параметры приложения выберите параметр Служба .
Откройте файл stdafx.h и перед любыми инструкциями заголовка
#include
определите_ATL_NO_COM_SUPPORT
:#define _ATL_NO_COM_SUPPORT
Выполните построение проекта.
В окне консоли зарегистрируйте службу:
ATLService /service
Запустите службу:
c:\>net start ATLService The ATLService service is starting. The ATLService service could not be started. The service did not report an error.
Добавьте код обходного решения и перестройте службу. Также может потребоваться повторная регистрация службы.
Снова запустите службу:
c:\>net start ATLService The ATLService service is starting. The ATLService service was started successfully.