这个是我以前看到的。你看看有没有帮助 要控制一个service的具体流程大概是这样的: 1、取得服务数据库的handle 2、根据服务数据库的handle取得服务的handle 3、根据服务的handle来取服务的状态或者控制服务 这是一个控制sqlserver服务启动关闭的例子 uses winsvcprocedure TForm1.Button1Click(Sender: TObject); var hscmanager,hService:SC_HANDLE; lpServiceArgVectors:Pchar; returnstatus:TServiceStatus; begin lpServiceArgVectors:=nil; hscmanager:=OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE);// 打开service control manager database hService:=OpenService(hscmanager,'MSSQLSERVER',SERVICE_ALL_ACCESS); case hService of ERROR_ACCESS_DENIED: Memo1.Lines.Add('The specified service control manager database handle does not have access to the service.'); ERROR_INVALID_HANDLE: Memo1.Lines.Add('The specified handle is invalid.'); ERROR_INVALID_NAME: Memo1.Lines.Add('The specified service name is invalid.'); ERROR_SERVICE_DOES_NOT_EXIST: Memo1.Lines.Add('The specified service does not exist.'); end; QueryServiceStatus(hService,returnstatus); //查看该Service的状态 case returnstatus.dwCurrentState of SERVICE_STOPPED: Memo1.Lines.Add('The service is not running.'); SERVICE_START_PENDING: Memo1.Lines.Add('The service is starting.'); SERVICE_STOP_PENDING: Memo1.Lines.Add('The service is stopping.'); SERVICE_RUNNING: memo1.lines.add('The service is running.'); SERVICE_CONTINUE_PENDING: Memo1.Lines.Add('The service continue is pending.'); SERVICE_PAUSE_PENDING: Memo1.Lines.Add('The service pause is pending.'); SERVICE_PAUSED: Memo1.Lines.Add('The service is paused'); end; if returnstatus.dwCurrentState=SERVICE_STOPPED then //如果该Service已停止则启动它 StartService(hService,0,lpServiceArgVectors); if returnstatus.dwCurrentState=SERVICE_RUNNING then ControlService(hService,SERVICE_CONTROL_STOP,returnstatus); //停止 CloseServiceHandle(hService);//关闭该Serviceend;
上面的例子很有用,比起execute要好得多,好处在于知道服务到底启动了没有。但是象 'World Wide Web Publishing Service' 这样的服务,为什么就没有反应?
例如
客户端-----------服务器【IIS】
SEND POST
接受消息以后 判断是否启动 IIS了2.利用API函数里面的
SHELLEXCUTE() 启动服务器了
要控制一个service的具体流程大概是这样的:
1、取得服务数据库的handle
2、根据服务数据库的handle取得服务的handle
3、根据服务的handle来取服务的状态或者控制服务
这是一个控制sqlserver服务启动关闭的例子
uses winsvcprocedure TForm1.Button1Click(Sender: TObject);
var
hscmanager,hService:SC_HANDLE;
lpServiceArgVectors:Pchar;
returnstatus:TServiceStatus;
begin
lpServiceArgVectors:=nil;
hscmanager:=OpenSCManager(nil,nil,SC_MANAGER_ENUMERATE_SERVICE);// 打开service control manager database
hService:=OpenService(hscmanager,'MSSQLSERVER',SERVICE_ALL_ACCESS); case hService of
ERROR_ACCESS_DENIED: Memo1.Lines.Add('The specified service control manager database handle does not have access to the service.');
ERROR_INVALID_HANDLE: Memo1.Lines.Add('The specified handle is invalid.');
ERROR_INVALID_NAME: Memo1.Lines.Add('The specified service name is invalid.');
ERROR_SERVICE_DOES_NOT_EXIST: Memo1.Lines.Add('The specified service does not exist.');
end; QueryServiceStatus(hService,returnstatus); //查看该Service的状态
case returnstatus.dwCurrentState of
SERVICE_STOPPED: Memo1.Lines.Add('The service is not running.');
SERVICE_START_PENDING: Memo1.Lines.Add('The service is starting.');
SERVICE_STOP_PENDING: Memo1.Lines.Add('The service is stopping.');
SERVICE_RUNNING: memo1.lines.add('The service is running.');
SERVICE_CONTINUE_PENDING: Memo1.Lines.Add('The service continue is pending.');
SERVICE_PAUSE_PENDING: Memo1.Lines.Add('The service pause is pending.');
SERVICE_PAUSED: Memo1.Lines.Add('The service is paused');
end;
if returnstatus.dwCurrentState=SERVICE_STOPPED then //如果该Service已停止则启动它
StartService(hService,0,lpServiceArgVectors); if returnstatus.dwCurrentState=SERVICE_RUNNING then
ControlService(hService,SERVICE_CONTROL_STOP,returnstatus); //停止
CloseServiceHandle(hService);//关闭该Serviceend;
'World Wide Web Publishing Service'
这样的服务,为什么就没有反应?