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

控制 Service 的元件

 
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-23 04:34:55 IP:218.18.xxx.xxx 未訂閱
因为要用自己的程序去控制Service 程序,完成安装Service/启动Service的过程,查了一下WIN32 API,把控制Service的几个函数找到了。为方便在DELPHI中使用及将来的 Re-use,我把它封装成元件。 代码如下: =============================================    
unit UControlService;
{---------------------------------------------------------------
  安装一个 Service 和启动一个 service 的控件。
-------------------------------------------------------------------}
interface    uses
  SysUtils, Windows, WinSvc, ShellAPI;    type
  TLjnServiceManager=Class
  private
    FServiceName:String;
    SMHandle:THandle;
    SHandle:THandle;
    ServiceExists:Boolean;   //指定的 Service 存在。
    FServiceFileName:String; //这个 service程序文件的全名
    FHandle:HWND; //调用本控件的程序的Handle        procedure CloseService;
  public
    procedure LjnSetServiceName(AValue:String);        constructor Create; 
    destructor Destroy; override;        function LjnOpenService(AServiceName:String):Boolean;
    procedure LjnStartService;
    procedure LjnStopService;
    function LjnInstallService:Boolean;
    procedure LjnSetServiceFileName(Value:String);
    procedure LjnSetProgHandle(Value:HWND);
  end;    implementation    { TLjnServiceManager }    procedure TLjnServiceManager.CloseService;
begin
  if SHandle>0 then
  begin
    CloseServiceHandle(SHandle);
  end;      if (SMHandle>0) then
  begin
    CloseServiceHandle(SMHandle);
  end;
end;    constructor TLjnServiceManager.Create;
begin
  inherited;
  SMHandle:=0;
  SHandle:=0;
  ServiceExists:=False;
end;    destructor TLjnServiceManager.Destroy;
begin
  CloseService;
  ServiceExists:=False;
  inherited;
end;    function TLjnServiceManager.LjnOpenService(AServiceName: String):Boolean;
begin
  Result:=False;
  CloseService;
  FServiceName:=AServiceName;
  SMHandle:=OpenSCManager(nil,nil,SC_MANAGER_CONNECT);
  SHandle:=OpenService(SMHandle,PChar(FServiceName),SERVICE_ALL_ACCESS);
  if SHandle>0 then
  begin
    ServiceExists:=True;
    Result:=True;
  end
  else
  begin
   // InstallService;
  end;
end;    procedure TLjnServiceManager.LjnSetServiceName(AValue: String);
begin
  FServiceName:=AValue;
end;    procedure TLjnServiceManager.LjnStartService;
var
  P:Pchar;
begin
  if ServiceExists then
    StartService(SHandle,0,P);
end;    procedure TLjnServiceManager.LjnStopService;
var
  P:TServiceStatus;
begin
  ControlService(SHandle,SERVICE_CONTROL_STOP,P);
end;    function TLjnServiceManager.LjnInstallService: Boolean;
var
  S1:String;
begin
{----------------------------------------------------------
  安装一个 Service
----------------------------------------------------------------------}
  Result:=False;
  if ServiceExists then Exit;
  S1:=' /install /SILENT';
  try
    ShellExecute(FHandle,'open',PAnsiChar(FServiceFileName),PAnsiChar(S1),nil,SW_HIDE);
  except
    Exit;
  end;
  Sleep(1000);
  Result:=True;
end;    procedure TLjnServiceManager.LjnSetServiceFileName(Value: String);
begin
  FServiceFileName:=Value;
end;    procedure TLjnServiceManager.LjnSetProgHandle(Value: HWND);
begin
  FHandle:=Value;
end;    end.
系統時間:2024-07-05 23:52:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!