我已经用SHELLEXECUTE()打开一个外部的后台服务的exe文件,因为这个exe文件是在DOS下运行(后台服务文件),没有窗体名称,不知道怎么关闭?

解决方案 »

  1.   

    unit ServiceManager;interfaceuses
      SysUtils, Windows, WinSvc;type  TServiceManager = class
      private
        { Private declarations }
        ServiceControlManager: SC_Handle;
        ServiceHandle: SC_Handle;
      protected
        function DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;
      public
        { Public declarations }
        function Connect(MachineName: PChar = nil; DatabaseName: PChar = nil;
          Access: DWORD = SC_MANAGER_ALL_ACCESS): Boolean;  // Access may be SC_MANAGER_ALL_ACCESS
        function OpenServiceConnection(ServiceName: PChar): Boolean;
        function StartService: Boolean; overload; // Simple start
        function StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;
          overload; // More complex start
        function StopService: Boolean;
        procedure PauseService;
        procedure ContinueService;
        procedure ShutdownService;
        procedure DisableService;
        function GetStatus: DWORD;
        function GetStatusCn: string;
        function ServiceRunning: Boolean;
        function ServiceStopped: Boolean;
      end;implementation{ TServiceManager }function TServiceManager.Connect(MachineName, DatabaseName: PChar;
      Access: DWORD): Boolean;
    begin
      { open a connection to the windows service manager }
      ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access);
      Result := (ServiceControlManager <> 0);
    end;
    function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean;
    begin
      { open a connetcion to a specific service }
      ServiceHandle := OpenService(ServiceControlManager, ServiceName, SERVICE_ALL_ACCESS);
      Result := (ServiceHandle <> 0);
    end;procedure TServiceManager.PauseService;
    var
      ServiceStatus: TServiceStatus;
    begin
      { Pause the service: attention not supported by all services }
      ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus);
    end;function TServiceManager.StopService: Boolean;
    var
      ServiceStatus: TServiceStatus;
    begin
      { Stop the service }
      Result := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus);
    end;procedure TServiceManager.ContinueService;
    var
      ServiceStatus: TServiceStatus;
    begin
      { Continue the service after a pause: attention not supported by all services }
      ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus);
    end;procedure TServiceManager.ShutdownService;
    var
      ServiceStatus: TServiceStatus;
    begin
      { Shut service down: attention not supported by all services }
      ControlService(ServiceHandle, SERVICE_CONTROL_SHUTDOWN, ServiceStatus);
    end;function TServiceManager.StartService: Boolean;
    begin
      Result := DoStartService(0, '');
    end;function TServiceManager.StartService(NumberOfArgument: DWORD;
      ServiceArgVectors: PChar): Boolean;
    begin
      Result := DoStartService(NumberOfArgument, ServiceArgVectors);
    end;function TServiceManager.GetStatus: DWORD;
    var
      ServiceStatus: TServiceStatus;
    begin
    { Returns the status of the service. Maybe you want to check this
      more than once, so just call this function again.
      Results may be: SERVICE_STOPPED
                      SERVICE_START_PENDING
                      SERVICE_STOP_PENDING
                      SERVICE_RUNNING
                      SERVICE_CONTINUE_PENDING
                      SERVICE_PAUSE_PENDING
                      SERVICE_PAUSED   }
      QueryServiceStatus(ServiceHandle, ServiceStatus);
      Result := ServiceStatus.dwCurrentState;
    end;procedure TServiceManager.DisableService;
    begin
      { Implementation is following... }
      DeleteService(ServiceHandle);
    end;function TServiceManager.ServiceRunning: Boolean;
    begin
      Result := (GetStatus = SERVICE_RUNNING);
    end;function TServiceManager.ServiceStopped: Boolean;
    begin
      Result := (GetStatus = SERVICE_STOPPED);
    end;function TServiceManager.DoStartService(NumberOfArgument: DWORD;
      ServiceArgVectors: PChar): Boolean;
    begin
      Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors);
    end;
    function TServiceManager.GetStatusCn: string;
    begin
      case GetStatus of
        SERVICE_STOPPED:          Result:='服务已停止';
        //SERVICE_START_PENDING:    Result:='正在启动服务';
        //SERVICE_STOP_PENDING:     Result:='正在停止服务';
        SERVICE_RUNNING:          Result:='服务正在运行';
        //SERVICE_CONTINUE_PENDING: Result:='正在重起服务';
        //SERVICE_PAUSE_PENDING:    Result:='正在停止服务';
        SERVICE_PAUSED:           Result:='服务已暂停';
      else
        Result:=( '状态未知' );
      end;
    end;end.//ServiceName为exe的服务名
    var
      FormServiceManger: TFormServiceManger;
    begin
    FServiceManager:=TServiceManager.Create;
    if Not FServiceManager.OpenServiceConnection(PAnsiChar(ServiceName)) then
      showmessage('当前服务状态:未安装服务')
    else
      FServiceManager.StopService;
    FServiceManager.Destroy;
    end;