我如何知道win2000中所有的服务,就像计算机管理中服务所显示的那样。我知道可以通过读取注册表得到这些信息,还有没有其他办法?望各位高手指教。

解决方案 »

  1.   

    有这样一个函数,应该可以帮助你BOOL EnumServicesStatus(
      SC_HANDLE hSCManager, // handle to service control manager database
      DWORD dwServiceType,     // type of services to enumerate
      DWORD dwServiceState,    // state of services to enumerate
      LPENUM_SERVICE_STATUS lpServices,
                               // pointer to service status buffer
      DWORD cbBufSize,         // size of service status buffer
      LPDWORD pcbBytesNeeded,  // pointer to variable for bytes needed
      LPDWORD lpServicesReturned,
                               // pointer to variable for number returned
      LPDWORD lpResumeHandle   // pointer to variable for next entry
    );它是从advapi32.dll中引出的,但是我在delphi的source中没找到。
    你再找找看吧,或者自己声明一下。
    若我有时间也好好研究下。
      

  2.   

    刚刚看了advapi32.dll的导出函数,还真有不少呢。RegCloseKey等注册表函数也在这里面,不过在windows.pas里倒是RegCloseKey的声明,Services相关的一个也没有。
    只好你自己声明了~~
      

  3.   

    ftp://delphi-jedi.org/api/win32api.zip
    里面有所有的win32api声明,
    上面那个函数在JwaWinSvc.pas单元里
      

  4.   

    你敲 ftp://delphi-jedi.org/api/ 就可以登陆这个ftp网站了,里面有很多东西呢。
      

  5.   

    那个ftp网站我连不上,不过我通过MSN查到相关的用法,我做了个一个简单的事例,各位大侠提提改进意见,代码如下:
    unit UserWinSvc;interfaceuses
      WinSvc, Windows;type _SC_ENUM_TYPE = (
    SC_ENUM_PROCESS_INFO        = 0
    );
    SC_ENUM_TYPE = _SC_ENUM_TYPE;  _SC_STATUS_TYPE = (
        SC_STATUS_PROCESS_INFO      = 0
      );
      SC_STATUS_TYPE = _SC_STATUS_TYPE;  _SERVICE_STATUS_PROCESS = record
        dwServiceType: DWORD;
        dwCurrentState: DWORD;
        dwControlsAccepted: DWORD;
        dwWin32ExitCode: DWORD;
        dwServiceSpecificExitCode: DWORD;
        dwCheckPoint: DWORD;
        dwWaitHint: DWORD;
        dwProcessId: DWORD;
        dwServiceFlags: DWORD;
      end;
      SERVICE_STATUS_PROCESS = _SERVICE_STATUS_PROCESS;
      LPSERVICE_STATUS_PROCESS = ^_SERVICE_STATUS_PROCESS;  _ENUM_SERVICE_STATUS_PROCESS = record
        lpServiceName: LPTSTR;
        lpDisplayName: LPTSTR;
        ServiceStatusProcess: SERVICE_STATUS_PROCESS;
      end;
      ENUM_SERVICE_STATUS_PROCESS = _ENUM_SERVICE_STATUS_PROCESS;
      LPENUM_SERVICE_STATUS_PROCESS = ^_ENUM_SERVICE_STATUS_PROCESS;  LPBYTE = PChar;function EnumServicesStatusEx(
        hSCManager: SC_HANDLE;       // handle to SCM database
        InfoLevel: SC_ENUM_TYPE;     // information level
        dwServiceType: DWORD;        // service type
        dwServiceState: DWORD;       // service state
        lpServices: LPBYTE;          // status buffer
        cbBufSize: DWORD;            // size of status buffer
        pcbBytesNeeded: LPDWORD;     // buffer size needed
        lpServicesReturned: LPDWORD; // number of entries returned
        lpResumeHandle: LPDWORD;     // next entry
        pszGroupName: LPCTSTR        // load-order group name
      ): BOOL; stdcall;function QueryServiceStatusEx(
        hService: SC_HANDLE;       // handle to service
        InfoLevel: SC_STATUS_TYPE; // information level
        lpBuffer: LPBYTE;          // buffer
        cbBufSize: DWORD;          // size of buffer
        var pcbBytesNeeded: DWORD     // bytes needed
      ): BOOL; stdcall;implementationconst
      advapi32 = 'advapi32.dll';function EnumServicesStatusEx;  external advapi32 name 'EnumServicesStatusExA';
    function QueryServiceStatusEx;  external advapi32 name 'QueryServiceStatusEx';end. 
    //=========================================================
      

  6.   

    unit U_Main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ExtCtrls, ActnList, ImgList, Buttons, ToolWin,
      StdCtrls, WinSvc, UserWinSvc, Menus;type
      TMainFrm = class(TForm)
        Bevel1: TBevel;
        SvcListView: TListView;
        EdtMachine: TEdit;
        ToolBar1: TToolBar;
        SpeedButton1: TSpeedButton;
        ImageList1: TImageList;
        ActionList1: TActionList;
        ActionStart: TAction;
        ActionPause: TAction;
        ActionStop: TAction;
        ActionContinue: TAction;
        ActionRestart: TAction;
        ActionRefresh: TAction;
        ToolButton1: TToolButton;
        ToolButton2: TToolButton;
        ToolButton3: TToolButton;
        ToolButton4: TToolButton;
        ToolButton5: TToolButton;
        SpeedButton2: TSpeedButton;
        STCBox: TComboBox;
        MacChkBox: TCheckBox;
        PopupMenu1: TPopupMenu;
        ActionRestart1: TMenuItem;
        ActionPause1: TMenuItem;
        ActionStop1: TMenuItem;
        ActionRefresh1: TMenuItem;
        N1: TMenuItem;
        N2: TMenuItem;
        procedure SpeedButton1Click(Sender: TObject);
        procedure ActionStartExecute(Sender: TObject);
        procedure ActionPauseExecute(Sender: TObject);
        procedure ActionStopExecute(Sender: TObject);
        procedure ActionContinueExecute(Sender: TObject);
        procedure ActionRestartExecute(Sender: TObject);
        procedure ActionRefreshExecute(Sender: TObject);
        procedure SvcListViewSelectItem(Sender: TObject; Item: TListItem;
          Selected: Boolean);
        procedure MacChkBoxClick(Sender: TObject);
        procedure SpeedButton2Click(Sender: TObject);
        procedure STCBoxSelect(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        SvrName: string;
        ServiceType: Integer;
        SelectItem: TListItem;
        procedure ListServices(schSCManager: SC_HANDLE; ServiceType: Integer);
        function SrvStatus(ServiceStatus: DWORD): string;
        function QueryServiceStatu(const Svchandle: SC_HANDLE): String;
      public
        { Public declarations }
      end;var
      MainFrm: TMainFrm;implementationuses U_Sys;{$R *.dfm}procedure TMainFrm.SpeedButton1Click(Sender: TObject);
    begin
      if SvcMgr > 0 then
        CloseServiceHandle(SvcMgr);
      if EdtMachine.Enabled then
        SvcMgr := OpenSCManager(Pchar(EdtMachine.Text),nil,SC_MANAGER_ALL_ACCESS)
      else
        SvcMgr := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
      if SvcMgr <= 0 then
      begin
        P_ShowError('开启服务失败,错误:'+IntToStr(GetLastError));
        Caption := '开启服务失败';
      end else begin
        if EdtMachine.Enabled then
          Caption := '连接'+EdtMachine.Text+'服务'
        else
          Caption := '连接本地服务';
          ListServices(SvcMgr, ServiceType);
      end;
    end;procedure TMainFrm.ActionStartExecute(Sender: TObject);
    var
      Svc: SC_HANDLE;
      tmpPChar: PChar;
    begin
      if SvrName = '' then
      begin
        P_ShowInfo('请先选择服务!');
        Exit;
      end;
      if SvcMgr > 0 then
      begin
        Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
        if Svc <= 0 then
        begin
          P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
          Exit;
        end;
        try
          if not StartService(Svc,0,tmpPChar) then
          begin
            P_ShowError('启动服务失败,错误:'+IntToStr(GetLastError));
          end else begin
            SelectItem.SubItems[2] := QueryServiceStatu(Svc);
          end;
        finally
          CloseServiceHandle(Svc);
        end;
      end else begin
        P_ShowInfo('请先连接所要管理机器!');
      end;
    end;procedure TMainFrm.ActionPauseExecute(Sender: TObject);
    var
      Svc: SC_HANDLE;
      tmpSS: TServiceStatus;
    begin
      if SvrName = '' then
      begin
        P_ShowInfo('请先选择服务!');
        Exit;
      end;
      if SvcMgr > 0 then
      begin
        Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
        if Svc <= 0 then
        begin
          P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
          Exit;
        end;
        try
          if not ControlService(Svc,SERVICE_CONTROL_PAUSE,tmpSS) then
          begin
            P_ShowError('暂停服务失败,错误:'+IntToStr(GetLastError));
          end else begin
            SelectItem.SubItems[2] := QueryServiceStatu(Svc);
          end;
        finally
          CloseServiceHandle(Svc);
        end;
      end else begin
        P_ShowInfo('请先连接所要管理机器!');
      end;
    end;procedure TMainFrm.ActionStopExecute(Sender: TObject);
    var
      Svc: SC_HANDLE;
      tmpSS: TServiceStatus;
    begin
      if SvrName = '' then
      begin
        P_ShowInfo('请先选择服务!');
        Exit;
      end;
      if SvcMgr > 0 then
      begin
        Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
        if Svc <= 0 then
        begin
          P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
          Exit;
        end;
        try
          if not ControlService(Svc,SERVICE_CONTROL_STOP,tmpSS) then
          begin
            P_ShowError('停止服务失败,错误:'+IntToStr(GetLastError));
          end else begin
            SelectItem.SubItems[2] := QueryServiceStatu(Svc);
          end;
        finally
          CloseServiceHandle(Svc);
        end;
      end else begin
        P_ShowInfo('请先连接所要管理机器!');
      end;
    end;
      

  7.   

    procedure TMainFrm.ActionContinueExecute(Sender: TObject);
    var
      Svc: SC_HANDLE;
      tmpSS: TServiceStatus;
    begin
      if SvrName = '' then
      begin
        P_ShowInfo('请先选择服务!');
        Exit;
      end;
      if SvcMgr > 0 then
      begin
        Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
        if Svc <= 0 then
        begin
          P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
          Exit;
        end;
        try
          if not ControlService(Svc,SERVICE_CONTROL_CONTINUE,tmpSS) then
          begin
            P_ShowError('继续服务失败,错误:'+IntToStr(GetLastError));
          end else begin
            SelectItem.SubItems[2] := QueryServiceStatu(Svc);
          end;
        finally
          CloseServiceHandle(Svc);
        end;
      end else begin
        P_ShowInfo('请先连接所要管理机器!');
      end;
    end;procedure TMainFrm.ActionRestartExecute(Sender: TObject);
    var
      Svc: SC_HANDLE;
      tmpPChar: PChar;
      tmpSS: TServiceStatus;
    begin
      if SvrName = '' then
      begin
        P_ShowInfo('请先选择服务!');
        Exit;
      end;
      if SvcMgr > 0 then
      begin
        Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
        if Svc <= 0 then
        begin
          P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
          Exit;
        end;
        try
          if not ControlService(Svc,SERVICE_CONTROL_STOP,tmpSS) then
            P_ShowError('停止服务失败,错误:'+IntToStr(GetLastError));
          if not StartService(Svc,0,tmpPChar) then
            P_ShowError('启动服务失败,错误:'+IntToStr(GetLastError));
          SelectItem.SubItems[2] := QueryServiceStatu(Svc);
        finally
          CloseServiceHandle(Svc);
        end;
      end else begin
        P_ShowInfo('请先连接所要管理机器!');
      end;
    end;procedure TMainFrm.ActionRefreshExecute(Sender: TObject);
    var
      Svc: SC_HANDLE;
      tmpSS: TServiceStatus;
    begin
      if SvrName = '' then
      begin
        P_ShowInfo('请先选择服务!');
        Exit;
      end;
      if SvcMgr > 0 then
      begin
        Svc := OpenService(SvcMgr,PChar(SvrName),SERVICE_ALL_ACCESS);
        if Svc <= 0 then
        begin
          P_ShowError('连接服务失败,错误:'+IntToStr(GetLastError));
          Exit;
        end;
        try
          if not ControlService(Svc,SERVICE_CONTROL_INTERROGATE,tmpSS) then
          begin
            P_ShowError('刷新服务失败,错误:'+IntToStr(GetLastError));
          end else begin
            SelectItem.SubItems[2] := QueryServiceStatu(Svc);
          end;
        finally
          CloseServiceHandle(Svc);
        end;
      end else begin
        P_ShowInfo('请先连接所要管理机器!');
      end;
    end;procedure TMainFrm.SvcListViewSelectItem(Sender: TObject; Item: TListItem;
      Selected: Boolean);
    begin
      SelectItem := Item;
      SvrName := Item.Caption;
    end;procedure TMainFrm.ListServices(schSCManager: SC_HANDLE; ServiceType: Integer);
    var
      lpServices: LPBYTE;
      n,nSize,npSize,nServicesReturned,nResumeHandle,dwServiceType:DWORD;
      ListItem: TListItem;
    begin
      if schSCManager > 0 then
      begin
        nResumeHandle := 0;
        npSize := Sizeof(ENUM_SERVICE_STATUS_PROCESS);
        if ServiceType > STCBox.Items.Count-1 then
        begin
          dwServiceType := SERVICE_WIN32;
        end else begin
          dwServiceType := ServiceType;
        end;    lpServices := LPBYTE(LocalAlloc(LPTR, 30720));
        try
          if not EnumServicesStatusEx(schSCManager, SC_ENUM_PROCESS_INFO,
            dwServiceType, SERVICE_STATE_ALL, lpServices, 30720,
            @nSize, @nServicesReturned,@nResumeHandle, nil) then
          begin
            P_ShowError('读取服务状态失败,错误:'+IntToStr(GetLastError));
            Exit;
          end;      for n := 0 to nServicesReturned-1 do
          begin
            //Show the name of service
            ListItem := SvcListView.Items.Add;
            ListItem.Caption := (LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.lpServiceName;
            ListItem.SubItems.Add((LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.lpDisplayName);
            ListItem.SubItems.Add(IntToStr((LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.ServiceStatusProcess.dwProcessId));
            ListItem.SubItems.Add(SrvStatus((LPENUM_SERVICE_STATUS_PROCESS(lpServices))^.ServiceStatusProcess.dwCurrentState));
            Inc(lpServices, npSize);
          end;
        finally
          if lpServices <> nil then
            LocalFree(Integer(lpServices));
        end;
      end;
    end;procedure TMainFrm.MacChkBoxClick(Sender: TObject);
    begin
      EdtMachine.Enabled := MacChkBox.Checked;
      if not MacChkBox.Checked then
        EdtMachine.Text := 'LocalHost';
    end;procedure TMainFrm.SpeedButton2Click(Sender: TObject);
    begin
      ListServices(SvcMgr, ServiceType);
    end;function TMainFrm.SrvStatus(ServiceStatus: DWORD): string;
    begin
      case ServiceStatus of
        SERVICE_STOPPED: result := '停止';
        SERVICE_START_PENDING: result := '启动中';
        SERVICE_STOP_PENDING: result := '停止中';
        SERVICE_RUNNING: result := '运行';
        SERVICE_CONTINUE_PENDING: result := '继续运行中';
        SERVICE_PAUSE_PENDING: result := '暂停中';
        SERVICE_PAUSED: result := '暂停';
      else
        result := '未知状态';
      end;
    end;procedure TMainFrm.STCBoxSelect(Sender: TObject);
    begin
      case STCBox.ItemIndex of
        0 : ServiceType := SERVICE_WIN32;
        1 : ServiceType := SERVICE_DRIVER;
        2 : ServiceType := SERVICE_KERNEL_DRIVER;
        3 : ServiceType := SERVICE_FILE_SYSTEM_DRIVER;
        4 : ServiceType := SERVICE_WIN32_OWN_PROCESS;
        5 : ServiceType := SERVICE_WIN32_SHARE_PROCESS;
        6 : ServiceType := SERVICE_WIN32 or SERVICE_DRIVER or
                SERVICE_KERNEL_DRIVER or SERVICE_FILE_SYSTEM_DRIVER or
                SERVICE_WIN32_OWN_PROCESS or SERVICE_WIN32_SHARE_PROCESS;
      else
        ServiceType := SERVICE_WIN32;
      end;
    end;procedure TMainFrm.FormCreate(Sender: TObject);
    begin
      SvcMgr := 0;
      SvcListView.Items.Clear;
      MacChkBoxClick(Sender);
      STCBoxSelect(Sender);
    end;procedure TMainFrm.FormDestroy(Sender: TObject);
    begin
      if SvcMgr > 0 then
        CloseServiceHandle(SvcMgr);
    end;function TMainFrm.QueryServiceStatu(const Svchandle: SC_HANDLE): String;
    var
      tmpSS: SERVICE_STATUS_PROCESS;
      n, nSize: DWORD;
    begin
      Result := '未知';
      if Svchandle > 0 then
      begin
        n := SizeOf(SERVICE_STATUS_PROCESS);
        if QueryServiceStatusEx(Svchandle, SC_STATUS_PROCESS_INFO, LPBYTE(@tmpSS), n, nSize) then
        begin
          Result := SrvStatus(tmpSS.dwCurrentState);
        end else begin
          P_ShowError('读取'+SvrName+'服务失败,错误: '+IntToStr(GetLastError));
        end;
      end;
    end;end.