将Delphi应用程序转换为作为服务运行 - 是否有必要?

时间:2010-11-05 00:29:19

标签: delphi user-interface service stay-logged-in

我有一个delphi应用程序,它记录来自不同地方的数据并将数据写入文件。该应用程序具有相当广泛的GUI,允许显示数据,选项配置等。

一位用户已请求将应用更改为可以作为服务运行。他的理由是,应用程序可以在启动时启动并在没有任何用户登录的情况下运行,并且无论谁登录都可以使用。

我的问题是:是否有任何其他解决方案可以让我安装现在存在的应用程序,以便它仍然可以在没有用户登录的情况下运行,并且仍可供所有用户使用?

我的直觉是将应用程序转换为服务运行并非易事。我假设您需要2个应用程序 - “无头”服务应用程序,以及由用户按需运行的GUI,可以与服务进行交互(此处也欢迎评论)。

6 个答案:

答案 0 :(得分:24)

我通常通过命令行开关/GUI创建我的应用程序,使其可以作为服务或GUI启动。

当应用程序使用GUI运行时,我实例化并“手动”启动服务类。

优点:

  • 它将运行相同的代码,使调试服务变得非常容易。您可以放置​​断点并逐步执行代码,而无需“附加”到正在运行的应用程序。

  • 由于GUI,您可以通过列表视图和按钮查看您的服务将要执行的操作,并与其进行交互,甚至在您没有调试器的远程服务器上也是如此。必须通过日志和配置与您的服务进行交互是蹩脚和缓慢的。

示例dpr,来自这样工作的项目:

program xxxx;

uses 
  SysUtils,
  SvcMgr,
  .......;

{$R *.res}

begin
  GlobalAppId := 1;
  MapMatcherController := TMapMatcherController.Create(nil);
  try
    if FindCmdLineSwitch('GUI',['/','-'],True) then
    begin
      Forms.Application.Initialize;
      Forms.Application.MainFormOnTaskbar := True;
      Forms.Application.CreateForm(TfrmMain, frmMain);
      Forms.Application.Run;
    end
    else
    begin
      SvcMgr.Application.Initialize;
      SvcMgr.Application.CreateForm(TsrvMapMatcher2, srvMapMatcher2);
      SvcMgr.Application.Run;
    end;
  finally
    MapMatcherController.Free;
 end;
end.

哦,另外要记住的是服务通常作为“系统”用户运行,这意味着您将拥有不同的权限和设置(例如驱动器号映射)。

答案 1 :(得分:7)

free之类的商业(和Firedaemon)解决方案,它们(几乎)将任何应用程序作为服务运行。

在旁注中,将逻辑和用户界面分开并不是很困难 - 在开发应用程序时,您应该已经完成​​了这一点。正因为Delphi使得在与用户界面相关联的代码中编写业务逻辑变得容易,这并不意味着您应该真正去做。看一下Martin Fowler's site的演示模式。

答案 2 :(得分:7)

通常可以有一个混合的单个exe,它又作为服务运行或作为完整的GUI标准应用程序运行。

您的应用程序需要多少工作才能满足此类别的要求,尤其是它在业务逻辑和用户界面逻辑之间的耦合方式。

此类应用程序的一个很好的例子是Delphi本身:$ DELPHI \ bin目录中的 scktsrvr.exe 作为GUI应用程序或服务运行(运行scktsrvr.exe / install to自动注册服务并使用管理控制台启动/停止它。

在文件夹$ DELPHI \ source \ db中,您将找到项目文件(scktsrvr.dpr / res,ScktCnst.pas,ScktMain.pas / dfm)。花点时间检查一下它是如何完成的,谁知道......也许这就是你正在寻找你的应用程序。

请注意,因为不允许Windows Vista 交互式服务在他/她的桌面上与用户进行交互。管理员必须启用交互式服务检测,并且用户必须更改为会话0桌面才能与您的服务进行交互(通过交互方式来查看并与您的服务表单进行交互)

答案 3 :(得分:2)

您可以尝试使用svrany,一种将应用程序作为服务运行的工具。 它是Server Resource Kit Tools的一部分。 try this link for 2003 server resource kit download

答案 4 :(得分:1)

这取决于您的应用程序,但通常可以实现。试试这个:http://iain.cx/src/nssm。在将应用程序作为服务启动之前,不要忘记启动应用程序所依赖的所有服务。谷歌周围有关如何做到这一点的信息。

答案 5 :(得分:1)

您可以编写一个启动应用程序的简单服务。但如果你关心你的应用未来,我会采取服务方式。是的,您必须将应用程序拆分为两部分,客户端/ GUI部分和服务本身,特别是因为Vista和7使服务出于安全原因显示用户界面变得更加困难。 服务有几个优点,它们在单独的会话中运行,它们可以设置为与给定用户运行,可能与登录的用户不同,只有具有适当权限的用户才能控制它们,Windows可以自动重启它们(或者执行它们)当他们失败时。其他行动。