Hola,
Los Servicios de Windows son un mundo entero. En la ayuda que acompaña a Delphi, el SDK de Wind32 describe las diferentes funciones para tratar con ellos. Pero, nosotros también contamos con la librería
Jedi JCL, no confundir con la
Jedi VCL. En la Jedi JCL hay no pocas unidades que pueden sernos útiles en un momento dado, y, entre otras, se encuentra la unidad "JclSvcCtrl.pas", la cual hace uso de las funciones de la API de Windows para trabajar con sus Servicios, e incluso, yendo más allá, cuenta con clases para tratar a los Servicios como si de objetos se trataran.
Por ejemplo, el siguiente código está adaptado (robado, debía decir, o poco menos) de la mencionada unidad de la Jedi JCL, y, como se ve, con el mismo conocermos todos los Servicios conque Windows cuente. De todos modos el código no valdrá de nada si no se comprende (ni tampoco se podrá ir más allá o más acá del mismo), y, como digo, si se tiene interés en esto último, a darse una vuelta por el SDK de Win32 y por la unidad "JclSvcCtrl.pas" de la Jedi JCL, para empezar a abrir boca. He dicho.
Código Delphi
[-]
uses
Dialogs, WinSvc;
procedure TfrmPrincipal.Button1Click(Sender: TObject);
var
i: integer;
continuar: boolean;
cbBufSize: Pointer;
lpServices: PEnumServiceStatus;
hSCManager, pcbBytesNeeded, lpServicesReturned, lpResumeHandle: DWORD;
begin
hSCManager := OpenSCManager('', nil, SC_MANAGER_ENUMERATE_SERVICE);
if (hSCManager <> 0) then
begin
lpResumeHandle := 0; try
cbBufSize := nil;
pcbBytesNeeded := SizeOf(lpServices);
repeat
ReallocMem(cbBufSize, pcbBytesNeeded);
continuar := EnumServicesStatus(hSCManager, SERVICE_TYPE_ALL, SERVICE_STATE_ALL,
PEnumServiceStatus(cbBufSize)^, pcbBytesNeeded, pcbBytesNeeded,
lpServicesReturned, lpResumeHandle);
until continuar or (GetLastError <> ERROR_MORE_DATA);
lpServices := cbBufSize;
for i := 0 to lpServicesReturned - 1 do
begin
Inc(lpServices);
end;
finally
FreeMem(cbBufSize);
end;
end;
end;