来段代码吧... lv: TListView;... var BytesNeeded,serviceReturned,resumeHandle:Dword; returnflag:Bool; lpservice:Array of TEnumServiceStatus; service:TEnumServiceStatus; i,bytes:Dword; hscmanager:SC_HANDLE; str:string; FAddress:String; li:TListItem; begin FAddress:='127.0.0.1'; returnflag:=false; resumeHandle:=0; BytesNeeded:=0; hscmanager:=OpenSCManager(pchar(str),0,SC_MANAGER_ALL_ACCESS);//打开service control manager database if hscmanager =0 then exit; returnflag:=EnumServicesStatus(hscmanager, SERVICE_WIN32 or SERVICE_DRIVER, SERVICE_ACTIVE or SERVICE_INACTIVE, service, 0, BytesNeeded, serviceReturned, resumeHandle); //先试图去枚举一下,以判断需要的长度 //枚举Service if (returnflag=false) and (GetLastError()=ERROR_MORE_DATA) then begin resumeHandle:=0; bytes:=BytesNeeded + sizeof(TEnumServiceStatus); SetLength(lpservice,bytes div sizeof(TEnumServiceStatus)+1); // 一定要设好大小,否则出错 returnflag:=EnumServicesStatus(hscmanager, SERVICE_WIN32,// or SERVICE_DRIVER, SERVICE_ACTIVE or SERVICE_INACTIVE, lpservice[0], bytes, BytesNeeded, serviceReturned, resumeHandle); lv.Clear; for i := 0 to serviceReturned-1 do begin Li:=lv.Items.Add; Li.Caption := lpService[i].lpServiceName; if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_STOPPED then li.SubItems.Add('Stopped') else if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_RUNNING then li.SubItems.Add('Running') else li.SubItems.Add('Pausing'); li.SubItems.Add(lpService[i].lpDisplayName); end; end; CloseServiceHandle(hscmanager);//关闭service control manager database
uses ...,WinSvc, ...
其实我是想查看某个服务是否已经安装了的...... 以下是源代码:function CheckIsInstalledService(ServiceName: string): Boolean; begin Result := OpenService(OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE), ServiceName,SERVICE_ALL_ACCESS) <> 0; end;
lv: TListView;...
var
BytesNeeded,serviceReturned,resumeHandle:Dword;
returnflag:Bool;
lpservice:Array of TEnumServiceStatus;
service:TEnumServiceStatus;
i,bytes:Dword;
hscmanager:SC_HANDLE;
str:string;
FAddress:String;
li:TListItem;
begin
FAddress:='127.0.0.1';
returnflag:=false;
resumeHandle:=0;
BytesNeeded:=0;
hscmanager:=OpenSCManager(pchar(str),0,SC_MANAGER_ALL_ACCESS);//打开service control manager database
if hscmanager =0 then
exit;
returnflag:=EnumServicesStatus(hscmanager,
SERVICE_WIN32 or SERVICE_DRIVER,
SERVICE_ACTIVE or SERVICE_INACTIVE,
service,
0,
BytesNeeded,
serviceReturned,
resumeHandle);
//先试图去枚举一下,以判断需要的长度
//枚举Service
if (returnflag=false) and (GetLastError()=ERROR_MORE_DATA) then
begin
resumeHandle:=0;
bytes:=BytesNeeded + sizeof(TEnumServiceStatus);
SetLength(lpservice,bytes div sizeof(TEnumServiceStatus)+1); // 一定要设好大小,否则出错
returnflag:=EnumServicesStatus(hscmanager,
SERVICE_WIN32,// or SERVICE_DRIVER,
SERVICE_ACTIVE or SERVICE_INACTIVE,
lpservice[0],
bytes,
BytesNeeded,
serviceReturned,
resumeHandle);
lv.Clear;
for i := 0 to serviceReturned-1 do
begin
Li:=lv.Items.Add;
Li.Caption := lpService[i].lpServiceName;
if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_STOPPED then
li.SubItems.Add('Stopped')
else if lpservice[i].ServiceStatus.dwCurrentState = SERVICE_RUNNING then
li.SubItems.Add('Running')
else li.SubItems.Add('Pausing');
li.SubItems.Add(lpService[i].lpDisplayName);
end;
end;
CloseServiceHandle(hscmanager);//关闭service control manager database
...,WinSvc, ...
以下是源代码:function CheckIsInstalledService(ServiceName: string): Boolean;
begin
Result := OpenService(OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE),
ServiceName,SERVICE_ALL_ACCESS) <> 0;
end;