请问各路高手?如何用程序启动NT中的服务程序?这些服务程序是我自己写的。

解决方案 »

  1.   

    unit Control;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ComCtrls, StdCtrls, WinSvc;const
         ServiceName='TomDemoService';  type
      TfrmMain = class(TForm)
        cmdStart: TButton;
        cmdStop: TButton;
        stsMessage: TStatusBar;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure cmdStopClick(Sender: TObject);
        procedure cmdStartClick(Sender: TObject);
      private
        { Private declarations }
        schService:SC_HANDLE;
        schSCManager:SC_HANDLE;
        ssStatus:TServiceStatus;
      public
        { Public declarations }
      end;var
      frmMain: TfrmMain;implementation{$R *.DFM}
    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
         schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
         if (schSCManager<=0) then
         begin
              MessageDlg('Tom Lee Demo Service is not installed.',mtError,[mbOk],0);
              Application.Terminate;
         end;     schService:=OpenService(schSCManager,ServiceName,SERVICE_ALL_ACCESS);
         if (schService<=0) then
         begin
              MessageDlg('Tom Lee Demo Service can not open.',mtError,[mbOk],0);
              Application.Terminate;
         end;
    end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
         CloseServiceHandle(schService);
         CloseServiceHandle(schSCManager);
    end;procedure TfrmMain.cmdStopClick(Sender: TObject);
    begin
         if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then
         begin
              stsMessage.SimpleText:='Stopping Service Now ';
              Sleep(1000);
              while (QueryServiceStatus(schService,ssStatus)) do
              begin
                   Application.ProcessMessages;
                   if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then
                   begin
                        stsMessage.SimpleText:=stsMessage.SimpleText+('.');
                        Sleep(1000);
                   end
                   else
                       break;
              end;          if ssStatus.dwCurrentState=SERVICE_STOPPED then
                  stsMessage.SimpleText:='Service Stop Ok'
              else
                  stsMessage.SimpleText:='Service Stop Fail';
         end
         else
             stsMessage.SimpleText:='Service Stop Fail';
    end;procedure TfrmMain.cmdStartClick(Sender: TObject);
    var
       Argv:PChar;
    begin
         if StartService(schService,0,Argv) then
         begin
              stsMessage.SimpleText:='Start Service Now ';
              Sleep(1000);
              while (QueryServiceStatus(schService,ssStatus)) do
              begin
                   Application.ProcessMessages;
                   if ssStatus.dwCurrentState=SERVICE_START_PENDING then
                   begin
                        stsMessage.SimpleText:=stsMessage.SimpleText+('.');
                        Sleep(1000);
                   end
                   else
                       break;
              end;          if ssStatus.dwCurrentState=SERVICE_RUNNING then
                  stsMessage.SimpleText:='Service Start Ok'
              else
                  stsMessage.SimpleText:='Service Start Fail';
         end
         else
              stsMessage.SimpleText:='Service Start Fail';
    end;end.这个帖子应该转到widow区
      

  2.   

    操纵 Windows NT/2000 的服务
    Function TMainForm.ServiceControl(aServiceName: String; aOp: Integer) : Boolean;
    Var
    scm : Cardinal;
        svc : Cardinal;
        sts : _SERVICE_STATUS;
        arg : PChar;
    begin
    Result := true;
    If ( ( GetVersion AND $80000000 ) = 0 ) Then  //  Is NT/2000
        Begin
    scm := OpenSCManager( Nil, Nil, SC_MANAGER_CONNECT );
         svc := OpenService( scm, PChar( aServiceName ), SERVICE_ALL_ACCESS );
        If ( svc <> 0 ) Then  //  *****这里是检查服务是否存在*****
         Begin
    QueryServiceStatus( svc, sts );  //  *****这里就是检查服务的状态*****
                If ( ( ( aOp = 0 ) AND ( sts.dwCurrentState <> SERVICE_STOPPED ) )
                 OR ( ( aOp = 1 ) AND ( sts.dwCurrentState <> SERVICE_RUNNING ) ) ) Then
                Begin
    arg := Nil;
             If ( aOp = 0 ) Then  //  Stop
                 Result := ControlService( svc, SERVICE_CONTROL_STOP, sts )
                 Else
                 Result := StartService( svc, 0, arg );
                End;
        CloseServiceHandle( svc );
    End;
         CloseServiceHandle( scm );
        End;
    end;
      

  3.   

    这是DELPHI 写的吗?
    怎么 1)  if (schSCManager<=0) then2)  if (schService<=0) then等的这些都编译不过去呀???????