在独立EXE和Windows服务之间切换

时间:2011-11-14 11:20:43

标签: delphi windows-services

我写了一个应用程序,在计时器上通过邮件发送日志。该应用程序具有简约的用户界面,一旦配置文件存在,它就可以在不需要与用户交互的情况下启动。

目前它是一个VCL Forms应用程序,但在某些情况下最好有一个服务(这样在服务器上运行时就不需要打开用户会话来运行应用程序)。

你有什么建议同时拥有这两个世界?在一些简单的场景中(小型组织,只有3个人,没有IT经理),“非服务”很好,因为它更容易理解和使用,但在更大的组织中,缺乏服务是一个问题。

是否可以同时提供服务和非服务?怎么做到这一点?我不想让部署更复杂,我想到的是一些命令行开关:当使用命令行参数运行时,它可以是一个服务,如果不是一个普通的应用程序......如何做到这一点?)。

3 个答案:

答案 0 :(得分:5)

好的......最好的方法是在同一个项目中开发“服务”和“非服务”应用程序。 就像这里解释的那样:A standalone Delphi application that can also be installed as windows service。 因此,您可以将相同的应用程序用作服务或独立应用程序。

如果你想在同一台PC上同时使用它们,那就更复杂了:你必须在独立的应用程序中添加功能:

  • 验证服务是否正在运行并处于活动状态。
  • 如果服务是 运行和活动,你必须与它对话而不是运行 独立的过程。

答案 1 :(得分:1)

我会创建一个控制面板小程序,用于设置应用程序所需的配置,然后将您的应用程序转换为服务。您的控制面板小程序也可以启动,停止和重新启动服务等。

你现在拥有两全其美。

约翰

答案 2 :(得分:0)

我所做的是有一个单独的项目,仅供开发使用。我只是创建一个表单,然后创建服务并进行预期的调用。

  unit fTestHarness;

  interface

  uses
     uMyServiceModule,
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;

  type
    TfrmCentralTest = class(TForm)
      Label1: TLabel;
      Label2: TLabel;
      procedure FormCreate(Sender: TObject);
      procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
      { Private declarations }
    public
      { Public declarations }
    end;

  var
    frmTest: TfrmTest;

  implementation

  {$R *.dfm}

  procedure TfrmCentralTest.FormCreate(Sender: TObject);
  var
     bStarted : boolean;
  begin
     bStarted := False;
     MyService := TMyService.Create(self);
     MyService.ServiceStart(nil, bStarted);
  end;

  procedure TfrmCentralTest.FormClose(Sender: TObject; var Action: TCloseAction);
  var
     bStopped : boolean;
  begin
     MyService.ServiceStop(nil, bStopped);
  end;

  end.