请教各位高手:在WIN2K下如何用API函数去开启、停止一个服务程序?在线等待!

hzl88688 2002-09-13 12:33:03
如题,最好能有源码。
...全文
49 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxk 2002-09-13
  • 打赏
  • 举报
回复
unit Unit_Service;

interface
uses Windows, Messages, SysUtils,Winsvc,Dialogs;

function StartServices(Const SvrName: String): Boolean;
function StopServices(Const SvrName: String): Boolean;
function QueryServiceStatu(Const SvrName: String): String;
function CreateServices(Const SvrName,FilePath: String): Boolean;
function DeleteServices(Const SvrName: String): Boolean;

implementation


//开启服务
function StartServices(Const SvrName: String): Boolean;
var
a,b: SC_HANDLE;
c: PChar;
begin
Result := False;

a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);

if a <= 0 then Exit;

b := OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);

if b <= 0 then Exit;

try
Result := StartService(b,0,c);

CloseServiceHandle(b);
CloseServiceHandle(a);
except
CloseServiceHandle(b);
CloseServiceHandle(a);
Exit;
end;
end;


//停止服务
function StopServices(Const SvrName: String): Boolean;
var
a,b: SC_HANDLE;
d: TServiceStatus;
begin
Result := False;

a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);

if a <= 0 then Exit;

b := OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);

if b <= 0 then Exit;

try
Result := ControlService(b,SERVICE_CONTROL_STOP,d);

CloseServiceHandle(a);
CloseServiceHandle(b);
except
CloseServiceHandle(a);
CloseServiceHandle(b);
Exit;
end;
end;


//查询当前服务的状态
function QueryServiceStatu(Const SvrName: String): String;
var
a,b: SC_HANDLE;
d: TServiceStatus;
begin
Result := '未安装';

a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);

if a <= 0 then Exit;

b := OpenService(a,PChar(SvrName),SERVICE_ALL_ACCESS);

if b <= 0 then Exit;

try
QueryServiceStatus(b,d);

if d.dwCurrentState = SERVICE_RUNNING then
Result := '启动' //Run
else if d.dwCurrentState = SERVICE_RUNNING then
Result := 'Wait' //Runing
else if d.dwCurrentState = SERVICE_START_PENDING then
Result := 'Wait' //Pause
else if d.dwCurrentState = SERVICE_STOP_PENDING then
Result := '停止' //Pause
else if d.dwCurrentState = SERVICE_PAUSED then
Result := '暂停' //Pause
else if d.dwCurrentState = SERVICE_STOPPED then
Result := '停止' //Stop
else if d.dwCurrentState = SERVICE_CONTINUE_PENDING then
Result := 'Wait' //Pause
else if d.dwCurrentState = SERVICE_PAUSE_PENDING then
Result := 'Wait'; //Pause

CloseServiceHandle(a);
CloseServiceHandle(b);
except
CloseServiceHandle(a);
CloseServiceHandle(b);
Exit;
end;
end;


{建立服务}
function CreateServices(Const SvrName,FilePath: String): Boolean;
var
a,b: SC_HANDLE;
begin
Result := False;

if FilePath ='' then Exit;

a := OpenSCManager(nil,nil,SC_MANAGER_CREATE_SERVICE);

if a <= 0 then Exit;
try
b := CreateService(a,PChar(SvrName),
PChar(SvrName),
SERVICE_ALL_ACCESS,
SERVICE_INTERACTIVE_PROCESS or SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
PChar(FilePath),nil,nil,nil,nil,nil);

if b <= 0 then begin
ShowMessage( SysErrorMessage( GetlastError ));
Exit;
end;

CloseServiceHandle(a);
CloseServiceHandle(b);

Result := True;
except
CloseServiceHandle(a);
CloseServiceHandle(b);
Exit;
end;
end;


{卸载服务}
function DeleteServices(Const SvrName: String): Boolean;
var
a,b: SC_HANDLE;
begin
Result := False;

a := OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);

if a <= 0 then Exit;

b := OpenService(a,PChar(SvrName),STANDARD_RIGHTS_REQUIRED);

if b <= 0 then Exit;

try
Result := DeleteService(b);

if not Result then
ShowMessage( SysErrorMessage( GetlastError ));

CloseServiceHandle(b);
CloseServiceHandle(a);

except
CloseServiceHandle(b);
CloseServiceHandle(a);
Exit;
end;
end;




end.
hzl88688 2002-09-13
  • 打赏
  • 举报
回复
在线等待高手!!!!

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧