Hola,
La siguiente función, que habrá de revisarse todo lo que se quiera, basada en una homónima que se encuentra en la unidad "
JclSrvCtrl.pas" (que para mí que lo contiene todo en cuanto a Servicios de Windows se refiere y su control desde Delphi), digo, que, la siguiente función retorna en la variable que se pasa como parámetro una lista con todos los nombres de los Servicios del sistema:
Código Delphi
[-]
uses
WinSvc;
procedure EnumServices(services: TStringList);
var
I: Integer;
Ret: BOOL;
PBuf: Pointer;
mn, db: Pchar;
hSCManager: SC_HANDLE;
PEss: PEnumServiceStatus;
BytesNeeded, ServicesReturned, ResumeHandle: DWORD;
begin
mn := nil;
db := nil;
services.Clear;
hSCManager := OpenSCManager(mn, db, SC_MANAGER_ENUMERATE_SERVICE);
if (hSCManager <> 0) then
begin
ResumeHandle := 0; try
PBuf := nil;
BytesNeeded := 40960;
repeat
ReallocMem(PBuf, BytesNeeded);
Ret := EnumServicesStatus(hSCManager, SERVICE_TYPE_ALL, SERVICE_STATE_ALL,
PEnumServiceStatus(PBuf)^, BytesNeeded, BytesNeeded,
ServicesReturned, ResumeHandle);
until Ret or (GetLastError <> ERROR_MORE_DATA);
PEss := PBuf;
for I := 0 to ServicesReturned-1 do
begin
services.Add(PEss^.lpServiceName);
Inc(PEss);
end;
finally
FreeMem(PBuf);
end;
end;
end;