PDA

Ver la Versión Completa : Trabajando con TServiceApplication


fide
25-10-2007, 04:29:54
Hola. Alguien me puede ayudar acerca de como Inicio un servicio desde una aplicacion delphi?

El problema es que cuando yo creo una application de tipo TService tengo que instalarla manualmente en el services.msc de Windows mediante la ejecucion de lo siguiente:

"DireccionDelService.exe" /Install /Silent

y luego Iniciarla manualmente tambien. Lo que necesito es saber como hacer estas dos cosas desde delphi, o por favor si pueden me dan alguna referencia que no sea la ayuda del delphi para crear y gestionar servicios. Gracias por la ayuda de antemano.

aeff
25-10-2007, 05:48:35
con ShellExecute puedes mandarlo a instalar, iniciar, pausar, desintalar, etc.., pero es una cosa "rustica",

¿por que no le hechas un ojo a esto (http://www.clubdelphi.com/foros/showthread.php?t=37552&highlight=CreateService)?

saludos!

aeff
25-10-2007, 06:24:30
mira fide, ahora me he puesto a "cacharrear" un poco y hice lo siguiente,


primero defino esto:


uses WinSvc;
...
const
svName = 'MySrv';
svDisplayName = 'Servicio de Alberto Enrique Franco Ferreiro';
...



mira, para instalar un servicio, hago esto en el onClick de un Button:


procedure TForm1.Button1Click(Sender: TObject);
var
vSCManager, vServiceCreated: Cardinal;
begin
vSCManager := 0;
vSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);

vServiceCreated := 0;
vServiceCreated :=
CreateService(vSCManager, svName, svDisplayName, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, 'C:\aeff.exe', nil, nil, nil, nil, nil);


CloseServiceHandle(vServiceCreated);
CloseServiceHandle(vSCManager);
end;



y para desintalarlo, entonces hago lo siguiente:


procedure TForm1.Button2Click(Sender: TObject);
var
vSCManager, vService : Cardinal;
sstatus: TServiceStatus;
begin
vSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
vService := OpenService(vSCManager, svName, SERVICE_ALL_ACCESS);
ControlService(vService, SERVICE_CONTROL_STOP, sstatus);
Sleep(500);
DeleteService(vService);
CloseServiceHandle(vService);
CloseServiceHandle(vSCManager);
RaiseLastWin32Error;
end;


espero que te sirva de algo

saludos, aeff!

aeff
25-10-2007, 06:30:01
ahhh! no he probado aun, pienso que sea así:

mira, para paralo, continuar, pausarlo, etc.. puedes hacer esto:


procedure TForm1.Button3Click(Sender: TObject);
var
vSCManager, vService : Cardinal;
sstatus: TServiceStatus;
begin
vSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
vService := OpenService(vSCManager, svName, SERVICE_ALL_ACCESS);
ControlService(vService, SERVICE_CONTROL_STOP, sstatus); CloseServiceHandle(vService);
CloseServiceHandle(vSCManager);
end;


en la linea roja, la funcion ControlService, en el segundo parámtro puedes usar lo siguiente, segun lo que quieras hacer


SERVICE_CONTROL_STOP
SERVICE_CONTROL_PAUSE
SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_INTERROGATE
SERVICE_CONTROL_SHUTDOWN



ahora, para iniciarlo nuevamente, prueba con la función *StartService(...)*, y si te quedas con dudas o no entiendes, entonces "tira pa' acá", que aqui hay un equipo que de seguro te ayudará

saludos!

fide
25-10-2007, 17:34:19
Oye albertico, yo lo entendi todo y esta ok. Gracias por la ayuda. Ha una duda...

en uno de los codigos que publicaste esta la instruccion


CreateService(vSCManager, svName, svDisplayName, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, 'C:\aeff.exe', nil, nil, nil, nil, nil);


Eso que tu instalas, el decir el aeff.exe tiene que ser un tservice creado en delphi verdad?

Solo eso es lo que me tiene con dudas!

fide
10-02-2008, 19:59:43
Oye albertico, yo lo entendi todo y esta ok. Gracias por la ayuda. Ha una duda...

en uno de los codigos que publicaste esta la instruccion


CreateService(vSCManager, svName, svDisplayName, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, 'C:\aeff.exe', nil, nil, nil, nil, nil);


Eso que tu instalas, el decir el aeff.exe tiene que ser un tservice creado en delphi verdad?

Solo eso es lo que me tiene con dudas!
Por favor que alguien me diga por que esto no quiere funcionar...