急。请问怎样通过程序来控制win2k下的服务的启动和关闭。

解决方案 »

  1.   

    要控制一个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;