全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2669
推到 Plurk!
推到 Facebook!

Windows 服務程式管理單元-修改版

 
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-08 20:18:02 IP:61.219.xxx.xxx 未訂閱
Windows 服務程式管理單元-修改版 =>新增服務程式安裝與移除。 1.原資料網址:   http://www.swissdelphicenter.ch/torry/showcode.php?id=1322 2.範例:   http://delphi.ktop.com.tw/topic.php?TOPIC_ID=75117    3.Windows 服務程式管理單元-修改版,程式碼如下:
unit ServiceManager;    interface    uses
  SysUtils, Windows, WinSvc;    type
  TServiceManager = class
  private
    { Private declarations }
    ServiceControlManager: SC_Handle;
    ServiceHandle: SC_Handle;
  protected
    function DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;
  public
    { Public declarations }
    function Connect(MachineName: PChar = nil; DatabaseName: PChar = nil;
      Access: DWORD = SC_MANAGER_ALL_ACCESS): Boolean;  // Access may be SC_MANAGER_ALL_ACCESS
    function OpenServiceConnection(ServiceName: PChar): Boolean;
    function StartService: Boolean; overload; // Simple start
    function StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;overload; // More complex start
    function StopService: Boolean;
    procedure PauseService;
    procedure ContinueService;
    procedure ShutdownService;
    procedure DisableService(ServiceName: PChar);
    function GetStatus: DWORD;
    function ServiceRunning: Boolean;
    function ServiceStopped: Boolean;
    function InstallService(ServiceName, DisplayName: PChar; Filename: string): Boolean;
    function UnInstallService(ServiceName: PChar): Boolean;
  end;    implementation    { TServiceManager }    function TServiceManager.Connect(MachineName, DatabaseName: PChar;
  Access: DWORD): Boolean;
begin
  Result := False;
  { open a connection to the windows service manager }
  ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access);
  Result := (ServiceControlManager <> 0);
end;    function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean;
begin
  Result := False;
  { open a connetcion to a specific service }
  ServiceHandle := OpenService(ServiceControlManager, ServiceName, SERVICE_ALL_ACCESS);
  Result := (ServiceHandle <> 0);
end;    procedure TServiceManager.PauseService;
var
  ServiceStatus: TServiceStatus;
begin
  { Pause the service: attention not supported by all services }
  ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus);
end;    function TServiceManager.StopService: Boolean;
var
  ServiceStatus: TServiceStatus;
begin
  { Stop the service }
  Result := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus);
end;    procedure TServiceManager.ContinueService;
var
  ServiceStatus: TServiceStatus;
begin
  { Continue the service after a pause: attention not supported by all services }
  ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus);
end;    procedure TServiceManager.ShutdownService;
var
  ServiceStatus: TServiceStatus;
begin
  { Shut service down: attention not supported by all services }
  ControlService(ServiceHandle, SERVICE_CONTROL_SHUTDOWN, ServiceStatus);
end;    function TServiceManager.StartService: Boolean;
begin
  Result := DoStartService(0, '');
end;    function TServiceManager.StartService(NumberOfArgument: DWORD;
  ServiceArgVectors: PChar): Boolean;
begin
  Result := DoStartService(NumberOfArgument, ServiceArgVectors);
end;    function TServiceManager.GetStatus: DWORD;
var
  ServiceStatus: TServiceStatus;
begin
{ Returns the status of the service. Maybe you want to check this
  more than once, so just call this function again.
  Results may be: SERVICE_STOPPED
                  SERVICE_START_PENDING
                  SERVICE_STOP_PENDING
                  SERVICE_RUNNING
                  SERVICE_CONTINUE_PENDING
                  SERVICE_PAUSE_PENDING
                  SERVICE_PAUSED   }
  Result := 0;
  QueryServiceStatus(ServiceHandle, ServiceStatus);
  Result := ServiceStatus.dwCurrentState;
end;    procedure TServiceManager.DisableService(ServiceName: PChar);
begin
  ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  ServiceHandle:= OpenService(ServiceControlManager, ServiceName, SERVICE_CHANGE_CONFIG);
  ChangeServiceConfig(ServiceHandle,
                      SERVICE_NO_CHANGE,SERVICE_DISABLED,SERVICE_NO_CHANGE,
                      nil,nil,nil,nil,nil,nil,nil);
  CloseServiceHandle(ServiceHandle);
  CloseServiceHandle(ServiceControlManager);
end;    function TServiceManager.ServiceRunning: Boolean;
begin
  Result := (GetStatus = SERVICE_RUNNING);
end;    function TServiceManager.ServiceStopped: Boolean;
begin
  Result := (GetStatus = SERVICE_STOPPED);
end;    function TServiceManager.DoStartService(NumberOfArgument: DWORD;
  ServiceArgVectors: PChar): Boolean;
var
  err: integer;
begin
  Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors);
end;    function TServiceManager.InstallService(ServiceName, DisplayName: PChar; Filename: string): Boolean;
begin
  Result := False;
  ServiceControlManager := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
  if ServiceControlManager = 0 then
    Exit;
  try
    ServiceHandle := CreateService(ServiceControlManager, ServiceName, DisplayName,
      SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,
      SERVICE_ERROR_NORMAL, PChar(Filename), nil, nil, nil, nil, nil);
    if ServiceHandle<>0 then
   begin
    CloseServiceHandle(ServiceHandle);
    Result:=true; //安裝完成
   end else
   begin
    CloseServiceHandle(ServiceHandle);
    Result:=false; //安裝失敗
   end;
  finally
    CloseServiceHandle(ServiceControlManager);
  end;
end;    function TServiceManager.UnInstallService(ServiceName: PChar): Boolean;
begin
  Result := False;
  ServiceControlManager:=OpenSCManager(nil,nil,GENERIC_WRITE);
  if ServiceControlManager = 0 then
    Exit;
  try
   ServiceHandle:=OpenService(ServiceControlManager,ServiceName,_DELETE);
   if DeleteService(ServiceHandle) then
   begin
    CloseServiceHandle(ServiceHandle);
    Result:=true; //移除完成
   end else
   begin
    CloseServiceHandle(ServiceHandle);
    Result:=false; //移除失敗
   end;
   finally
    CloseServiceHandle(ServiceControlManager);
  end;
end;    end.
ps.若有新增或修改,歡迎提供分享~~ < src="http://delphi.ktop.com.tw/download/upload\33223_qoo.gif">網海無涯,唯學是岸! 發表人 - qoo1234 於 2005/08/08 20:27:47
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-11 18:07:46 IP:61.219.xxx.xxx 未訂閱
補充:
 
// convert status codes returned by
// TServiceManager.GetStatus() to string values
 
function TServiceManager.ServiceGetStrCode(nID : integer) : string;
var
  s : string;
begin
  case nID of
   SERVICE_STOPPED          : s := 'STOPPED';
   SERVICE_RUNNING          : s := 'RUNNING';
   SERVICE_PAUSED           : s := 'PAUSED';
   SERVICE_START_PENDING    : s := 'START/PENDING';
   SERVICE_STOP_PENDING     : s := 'STOP/PENDING';
   SERVICE_CONTINUE_PENDING : s := 'CONTINUE/PENDING';
   SERVICE_PAUSE_PENDING    : s := 'PAUSE/PENDING';
  else
   s := 'UNKNOWN';  
  end;
  Result := s;
end;
網海無涯,唯學是岸!
系統時間:2024-07-07 0:06:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!