11

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

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

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

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

4

6 回答 6

26

我通常以这样一种方式创建我的应用程序,它可以通过命令行开关作为服务或 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.

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

于 2010-11-05T01:00:48.887 回答
7

有像Firedaemon这样的商业(和免费)解决方案,它将(几乎)将任何应用程序作为服务运行。

在旁注中,分离逻辑和用户界面应该不难——你应该在开发应用程序时就已经这样做了。仅仅因为 Delphi 使得在与用户界面相关联的代码中编写业务逻辑变得容易,这并不意味着您真的应该这样做。查看Martin Fowler 网站上的演示模式。

于 2010-11-05T00:37:30.553 回答
7

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

你的应用程序需要多少努力来适应这个类别取决于它是如何设计的,特别是在业务逻辑和用户界面逻辑之间的耦合方面。

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

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

考虑到 Windows Vista交互式服务不允许在用户的桌面上与用户进行交互。管理员必须启用交互式服务检测,并且用户必须更改到会话 0 桌面才能与您的服务交互(通过交互意味着查看并与您的服务表单交互)

于 2010-11-05T00:52:48.600 回答
2

您可以尝试使用 svrany,这是一种将应用程序作为服务运行的工具。它是服务器资源工具包工具的一部分。 试试这个链接,下载 2003 服务器资源包

于 2010-11-08T13:19:32.353 回答
1

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

于 2010-11-05T08:37:47.600 回答
1

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

于 2010-11-05T13:26:06.607 回答