2008-09-03 14 views
7

Por lo tanto, crear un servicio de Windows usando Visual Studio es bastante trivial. Mi pregunta profundiza en cuanto a qué hace que un ejecutable se pueda instalar como un servicio & cómo escribir un servicio como una aplicación C directa. No pude encontrar muchas referencias sobre esto, pero supongo que tiene que haber alguna interfaz que pueda implementar para que mi .exe se pueda instalar como un servicio.Creando el servicio de Windows sin Visual Studio

Respuesta

3

La configuración de su ejecutable como servicio es parte de ella, pero, en realidad, generalmente se maneja con el software de instalación que esté utilizando. Puede usar la herramienta de línea de comando SC durante la prueba (o si no necesita un instalador).

Lo importante es que su programa debe llamar a StartServiceCtrlDispatcher() al iniciarse. Esto conecta su servicio al administrador de control de servicio y configura una rutina ServiceMain que es el punto de entrada principal de su servicio.

ServiceMain (puede llamarlo como quiera realmente, pero siempre parece ser ServiceMain) debe llamar a RegisterServiceCtrlHandlerEx() para definir una rutina de devolución de llamada para que el sistema operativo pueda notificar a su servicio cuando ocurran ciertos eventos.

Éstos son algunos fragmentos de un servicio que escribí hace unos años:

configura como un servicio:

SERVICE_TABLE_ENTRY ServiceStartTable[] = 
{ 
    { "ServiceName", ServiceMain }, 
    { 0, 0 } 
}; 

if (!StartServiceCtrlDispatcher(ServiceStartTable)) 
{ 
    DWORD err = GetLastError(); 
    if (err == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) 
     return false; 
} 

ServiceMain:

void WINAPI ServiceMain(DWORD, LPTSTR*) 
{ 
    hServiceStatus = RegisterServiceCtrlHandlerEx("ServiceName", ServiceHandlerProc, 0); 

manejador de servicio:

DWORD WINAPI ServiceHandlerProc(DWORD ControlCode, DWORD, void*, void*) 
{ 
    switch (ControlCode) 
    { 
    case SERVICE_CONTROL_INTERROGATE : 
     // update OS about our status 
    case SERVICE_CONTROL_STOP : 
     // shut down service 
    } 

    return 0; 
} 
1

Sé que llegué un poco tarde a la fiesta, pero recientemente tuve la misma pregunta y tuve que luchar entre las redes buscando respuestas.

Me las arreglé para encontrar este artículo en MSDN que, de hecho, sienta las bases. Terminé combinando muchos de los archivos aquí en un solo exe que contiene todos los comandos que necesito, y agregué mi propio método "void run()" que gira por la vida entera del servicio para mis propias necesidades.

Esto sería un gran comienzo a otra persona con exactamente esta pregunta, así que para los investigadores futuros por ahí, comprobar que funciona:

la muestra completa Servicio http://msdn.microsoft.com/en-us/library/bb540476(VS.85).aspx

Cuestiones relacionadas