2011-05-19 61 views
6

He creado un servicio de Windows en Delphi. Mi código se ejecuta dentro ServiceExecuteCrear un servicio de Windows en delphi

procedure TMyService.ServiceExecute(Sender: TService); 
while not Terminated do 
begin 
     CallSomeProcedure; 
     Sleep(1000); 
     ServiceThread.ProcessRequests(false); 
end; 
end; 

Por desgracia, no puedo obtener este código se ejecute. No parece llamar al procedimiento incluso cuando estoy depurando. El código en Myservice.exe tiene este aspecto.

begin 
    if not Application.DelayInitialize or Application.Installing then 
     Application.Initialize; 
    Application.CreateForm(TMyService, MyService); 
    Application.Run; 
end. 

puedo conseguir el serviceExecute para funcionar si añado

MyService.ServiceExecute(nil); 

en MiServicio.exe sin embargo, si se instala como un servicio que no parece estar funcionando como Application.Run no hace nada

No estoy seguro de lo que estoy haciendo mal, pero cualquier ayuda sería muy apreciada.

Gracias

+1

Nada me parece incorrecto. –

Respuesta

8

No se puede ejecutar el servicio desde el IDE para depurarlo; en ese caso, simplemente saldrá. El servicio debe ser iniciado por el administrador de control de servicio. Además, no debe llamar a ServiceExecute directamente.

Aquí está documentation cómo depurar servicios.

+0

Gracias por la respuesta rápida. Lo tengo que depurar ahora y solo estoy teniendo problemas con el ADOQuery que estoy usando. Debería poder solucionar el problema ahora puedo depurarlo. Gracias – user761275

+0

Bienvenido, me alegro de ayudar. :-) –

4

Si ha creado un servicio, puede instalarlo ejecutando con el parámetro /install

Después de eso, el servicio debe aparecer entre los otros servicios (ir a start/run/ y entrar services.msc).

Puede iniciarlo y puede depurarlo adjuntando el depurador.

Sin embargo, es doloroso trabajar así. No puedo creer que algunas personas realmente trabajen así. Normalmente tengo toda mi lógica comercial en unidades separadas que puedo ejecutar desde una aplicación "normal". Solo cuando eso sale bien, lo envuelvo en un servicio y lo intento.

A veces incluso creo una aplicación que se puede ejecutar como un servicio o con una GUI. Simplemente puede crear una instancia de su clase de servicio. Solo necesita iniciarlo usted mismo, pero será mucho más fácil de depurar.

1

Hay commercial solution que se desarrolló específicamente para simplificar el proceso de depuración del servicio. Puede debug your code directamente desde Delphi IDE, incluido el evento OnStart del servicio.

+0

svCom es mucho más que solo depuración. Es todo un marco de servicio propio como reemplazo de TService. En mis proyectos TService, simplemente coloco un bucle 'IsDebuggerPresent()' al comienzo del controlador de eventos OnStart, y luego adjunto el depurador al proceso de servicio una vez que SCM lo ha lanzado. Funciona bien. –

Cuestiones relacionadas