+ -
当前位置:首页 → 问答吧 → 怎样枚举Windows服务

怎样枚举Windows服务

时间:2011-10-25

来源:互联网

很久没来CSDN了,首先向大家问个好,向大家请教个问题,怎样枚举Windows服务?

作者: cockroachhz   发布时间: 2011-10-25

来段代码吧
Delphi(Pascal) code

...
    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



作者: sonicer   发布时间: 2011-10-25

uses
  ...,WinSvc, ...

作者: sonicer   发布时间: 2011-10-25

其实我是想查看某个服务是否已经安装了的......
以下是源代码:
Delphi(Pascal) code

function CheckIsInstalledService(ServiceName: string): Boolean;
begin
  Result := OpenService(OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE),
              ServiceName,SERVICE_ALL_ACCESS) <> 0;
end;

作者: cockroachhz   发布时间: 2011-10-25

刚刚看了下SDK......

作者: cockroachhz   发布时间: 2011-10-25