我最近写了一个服务程序,但INSTALL以后,它只有启动功能,启动后,它就自动的停了。不知哪位高手能够提供一个服务程序的源代码,供我们学习一下。

解决方案 »

  1.   

    你启动后需要一个WHILE NOT TERMINATED DO
    BEGIN
    END;的死循环来处理,循环里面有异常等情况下就自动终止了;
      

  2.   

    unit MailService;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
      Db, ADODB, IniFiles, OleServer, ZMCRYPTLib_TLB, MailThread;type
      TService1 = class(TService)
        ADOConnection1: TADOConnection;
        ADODataSet1: TADODataSet;
        crypt31: Tcrypt3;
        ADODataSet2: TADODataSet;
        ADOCommand1: TADOCommand;
        ADODataSet3: TADODataSet;
        procedure ServiceStop(Sender: TService; var Stopped: Boolean);
        procedure ServiceStart(Sender: TService; var Started: Boolean);
        procedure ServicePause(Sender: TService; var Paused: Boolean);
        procedure ServiceContinue(Sender: TService; var Continued: Boolean);
        procedure ServiceShutdown(Sender: TService);
        procedure ServiceCreate(Sender: TObject);
      private
        { Private declarations }
        aThread: TMailThread;
      public
        { Public declarations }
        function GetServiceController: TServiceController; override;
      end;var
      ZmMailService: TService1;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
      ZmMailService.Controller(CtrlCode);
    end;function TService1.GetServiceController: TServiceController;
    begin
      Result := ServiceController;
    end;procedure TService1.ServiceStop(Sender: TService;
      var Stopped: Boolean);
    begin
      if aThread <> nil then aThread.Terminate;
      Stopped := true;
    end;procedure TService1.ServiceStart(Sender: TService;
      var Started: Boolean);
    begin
      aThread := TMailThread.Create(false);  //线程创建后马上开始运行
      Started := true;
    end;procedure TService1.ServicePause(Sender: TService;
      var Paused: Boolean);
    begin
      if aThread <> nil then aThread.Suspend;
      Paused := true;
    end;procedure TService1.ServiceContinue(Sender: TService;
      var Continued: Boolean);
    begin
      if aThread <> nil then aThread.Resume;
      Continued := true;
    end;procedure TService1.ServiceShutdown(Sender: TService);
    begin
      if aThread <> nil then aThread.Terminate;
    end;procedure TService1.ServiceCreate(Sender: TObject);
    var
      IniFile: TIniFile;
      Server,DBUser,DBPassword: string;
    begin
      //从配置文件读取数据库配置信息
      IniFile := TIniFile.Create('EDU.INI');
      try
        Server := IniFile.ReadString('Database','Server','');
        DBUser := IniFile.ReadString('Database','DBUser','');
        DBPassword := IniFile.ReadString('Database','DBPassword','');
        DBPassword := crypt31.RC4(DBPassword,DBUser);
      finally
        IniFile.Free;
      end;  with ADOConnection1 do
      try
        ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;User ID=;' +
          'Data Source=' + Server;
        Open(DBUser, DBPassword);
      finally  end;
    end;end.