金笛工业手机论坛

金笛工业手机论坛 (http://bbs.sendsms.cn/)
-   短信开发资料 (http://bbs.sendsms.cn/cy-ae-eu-ae/)
-   -   delphi调用API来实启动/停止/卸载windows服务 (http://bbs.sendsms.cn/cy-ae-eu-ae/646.htm)

susu8988 2009-10-22 10:27

delphi调用API来实启动/停止/卸载windows服务
 
建议参考一下Delphi的ScktSrvr原码, $(DELPHI)\Source\Vcl\ScktSrvr.dpr

--------------------------------------------------------------------------------
windows 系统服务
--------------------------------------------------------------------------------
function StartService(AServName: string): Boolean; //use WinSvc
var
SCManager, hService: SC_HANDLE;
lpServiceArgVectors: PChar;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
Result := SCManager <> 0;
if Result then
try
hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
Result := hService <> 0;
if (hService = 0) and (GetLastError = ERROR_SERVICE_DOES_NOT_EXIST) then
Exception.Create('The specified service does not exist');
if hService <> 0 then
try
lpServiceArgVectors := nil;
Result := WinSvc.StartService(hService, 0, PChar(lpServiceArgVectors));
if not Result and (GetLastError = ERROR_SERVICE_ALREADY_RUNNING) then
Result := True;
finally
CloseServiceHandle(hService);
end;
finally
CloseServiceHandle(SCManager);
end;
end;


function StopService(AServName: string): Boolean;
var
SCManager, hService: SC_HANDLE;
SvcStatus: TServiceStatus;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
Result := SCManager <> 0;
if Result then
try
hService := OpenService(SCManager, PChar(AServName), SERVICE_ALL_ACCESS);
Result := hService <> 0;
if Result then
try //停止并卸载服务;
Result := ControlService(hService, SERVICE_CONTROL_STOP, SvcStatus);
//删除服务,这一句可以不要;
// DeleteService(hService);
finally
CloseServiceHandle(hService);
end;
finally
CloseServiceHandle(SCManager);
end;
end;


------------------------------------------------------------------------------------------------------
Others
------------------------------------------------------------------------------------------------------


uses
Winsvc,..,;

function RunServies(svr:String):Boolean;//启动某个服务;
var
schService:SC_HANDLE;
schSCManager:SC_HANDLE;
ssStatus:TServiceStatus;
Argv:PChar;
begin
schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
schService:=OpenService(schSCManager,Pchar(svr),SERVICE_ALL_ACCESS);
result := True;
try
if StartService(schService,0,Argv) then
begin
while (QueryServiceStatus(schService,ssStatus)) do
begin
Sleep(500);
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_START_PENDING then
Sleep(500)
else
Break;
end;//while
if ssStatus.dwCurrentState=SERVICE_RUNNING then
result := True
else
result := False;
end
else
result := False;
finally
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
end;
end;
function StopServies(svr:String):Boolean;//停止某个服务;
var
schService:SC_HANDLE;
schSCManager:SC_HANDLE;
ssStatus:TServiceStatus;
begin
schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
schService:=OpenService(schSCManager,Pchar(svr),SERVICE_ALL_ACCESS);
try
if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then
begin
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then
Sleep(1000)
else
break;
end; //while
if ssStatus.dwCurrentState=SERVICE_STOPPED then
result := True
else
result := False;
end
else
result := False;
finally
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
end;
end;

------------------------------------------------------------------------------------------------------
Others
------------------------------------------------------------------------------------------------------


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Winsvc;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
schService:SC_HANDLE;
schSCManager:SC_HANDLE;
ssStatus:TServiceStatus;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
schService:=OpenService(schSCManager,'alerter',SERVICE_ALL_ACCESS);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Argv:PChar;
begin
if StartService(schService,0,Argv) then
begin
form1.caption:='Start Service Now ';
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_START_PENDING then
begin
form1.caption:=form1.caption+('.');
Sleep(1000);
end else break;
end;
if ssStatus.dwCurrentState=SERVICE_RUNNING then
form1.caption:='Service Start Ok'
else form1.caption:='Service Start Fail';
end
else form1.caption:='Service Start Fail';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then
begin
form1.caption:='Stopping Service Now ';
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then
begin
form1.caption:=form1.caption+('.');
Sleep(1000);
end else break;
end;
if ssStatus.dwCurrentState=SERVICE_STOPPED then
form1.caption:='Service Stop Ok'
else form1.caption:='Service Stop Fail';
end
else form1.caption:='Service Stop Fail';
end;
end.


所有时间均为北京时间。现在的时间是 21:33

Powered by vBulletin® 版本 3.8.3
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.