El servicio ATL con _ATL_NO_COM_SUPPORT definido no se iniciará
Este artículo le ayuda a resolver el problema por el que el Asistente para Project active template library (ATL) no se iniciará como servicio después de crear un proyecto de servicio ATL predeterminado.
Versión original del producto: Visual Studio 2010
Número de KB original: 2480736
Síntomas
Después de crear un proyecto de servicio ATL predeterminado mediante el Asistente para Project ATL, registre el servicio con el parámetro de línea /Service de comandos e intente iniciar el servicio con net start. El servicio se inicia y, a continuación, se cierra inmediatamente con el siguiente mensaje:
No se pudo iniciar el servicio
c:\>net start ATLService
The ATLService service is starting........
The ATLService service could not be started.
The service did not report an error.
Causa
Las bibliotecas de clases base del servicio ATL no llaman al método SetServiceStatusWin32 (SERVICE_RUNNING) si no hay ningún objeto DE MODELO de objetos de componente ATL (COM) implementado en el servicio.
Solución
El servicio ATL está diseñado principalmente como un host de servicio para objetos COM, por lo que la expectativa es que el desarrollador agregue objetos COM al servicio.
Sin embargo, es posible usar ATL sin COM. Por ejemplo, hay una _ATL_NO_COM_SUPPORT macro, que puede definir y que desactivará la mayor parte de la compatibilidad para registrar e implementar objetos COM en la biblioteca ATL.
Debido a un error en las clases base del servicio, si _ATL_NO_COM_SUPPORT se define, no se realiza la SetServiceStatusllamada (SERVICE_RUNNING) y el servicio se iniciará y, a continuación, se cerrará inmediatamente.
Para solucionar este error, reemplace la función en CAtlServiceModule la PreMessageLoop clase derivada y llame a SetServiceStatus:
HRESULT PreMessageLoop(int nShowCmd)
{
SetServiceStatus(SERVICE_RUNNING);
return __super::PreMessageLoop(nShowCmd);
}
Nota
Esta PreMessageLoop invalidación solo es relevante para los servicios ATL que se han _ATL_NO_COM_SUPPORT definido.
Más información
Cree un nuevo Project ATL con el Asistente para proyectos.
Asigne al proyecto el nombre ATLService y, en la Configuración Aplicación, seleccione la opción Servicio.
Abra el archivo stdafx.h y, antes de cualquier instrucción de encabezado
#include, defina_ATL_NO_COM_SUPPORT:#define _ATL_NO_COM_SUPPORTCree el proyecto.
En una ventana de consola, registre el servicio:
ATLService /serviceInicie el servicio:
c:\>net start ATLService The ATLService service is starting. The ATLService service could not be started. The service did not report an error.Agregue el código de solución alternativa y recompile el servicio. Es posible que también tenga que volver a registrar el servicio.
Vuelva a iniciar el servicio:
c:\>net start ATLService The ATLService service is starting. The ATLService service was started successfully.