Служба 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 не вызывают метод SetServiceStatusWin32 (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.

Дополнительная информация

  1. Создайте проект ATL с помощью мастера проектов.

  2. Назовите проект ATLService и в разделе Параметры приложения выберите параметр Служба .

  3. Откройте файл stdafx.h и перед любыми инструкциями заголовка #include определите _ATL_NO_COM_SUPPORT:

    #define _ATL_NO_COM_SUPPORT
    
  4. Выполните построение проекта.

  5. В окне консоли зарегистрируйте службу:

    ATLService /service  
    
  6. Запустите службу:

    c:\>net start ATLService
    The ATLService service is starting.
    The ATLService service could not be started.
    
    The service did not report an error.
    
  7. Добавьте код обходного решения и перестройте службу. Также может потребоваться повторная регистрация службы.

  8. Снова запустите службу:

    c:\>net start ATLService
    The ATLService service is starting.
    The ATLService service was started successfully.