我有一个delphi应用程序,它记录来自不同地方的数据并将数据写入文件。该应用程序具有相当广泛的GUI,允许显示数据,选项配置等。
一位用户已请求将应用更改为可以作为服务运行。他的理由是,应用程序可以在启动时启动并在没有任何用户登录的情况下运行,并且无论谁登录都可以使用。
我的问题是:是否有任何其他解决方案可以让我安装现在存在的应用程序,以便它仍然可以在没有用户登录的情况下运行,并且仍可供所有用户使用?
我的直觉是将应用程序转换为服务运行并非易事。我假设您需要2个应用程序 - “无头”服务应用程序,以及由用户按需运行的GUI,可以与服务进行交互(此处也欢迎评论)。
答案 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可以自动重启它们(或者执行它们)当他们失败时。其他行动。