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

解决方案 »

  1.   

    来段代码吧...
        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
      

  2.   

    uses
      ...,WinSvc, ...
      

  3.   

    其实我是想查看某个服务是否已经安装了的......
    以下是源代码:function CheckIsInstalledService(ServiceName: string): Boolean;
    begin
      Result := OpenService(OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE),
                  ServiceName,SERVICE_ALL_ACCESS) <> 0;
    end;