ros*_*mcm 10 delphi service user-interface stay-logged-in
我有一个delphi应用程序,它记录来自不同地方的数据并将数据写入文件.该应用程序具有相当广泛的GUI,允许显示数据,选项配置等.
一位用户已请求将应用程序更改为可以作为服务运行.他的理由是,应用程序可以在启动时启动并在没有任何用户登录的情况下运行,并且无论谁登录都可以使用.
我的问题是:是否有任何其他解决方案可以让我安装应用程序,因为它现在存在,以便它仍然可以运行,没有用户登录,仍然可供所有用户使用?
我的直觉是将应用程序转换为服务运行并非易事.我假设您需要2个应用程序 - "无头"服务应用程序,以及由用户按需运行的GUI,可以与服务进行交互(此处也欢迎评论).
Wou*_*ick 25
我通常以这样一种方式创建我的应用程序,它可以通过命令行开关作为服务或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.
Run Code Online (Sandbox Code Playgroud)
哦,另外要记住的是服务通常作为"系统"用户运行,这意味着您将拥有不同的权限和设置(例如驱动器号映射).
有像Firedaemon这样的商业(和免费)解决方案,它将(几乎)任何应用程序作为服务运行.
在旁注中,将逻辑和用户界面分开并不是很困难 - 在开发应用程序时,您应该已经完成了这一点.正因为Delphi使得在与用户界面相关联的代码中编写业务逻辑变得容易,这并不意味着您应该真正去做.看看Martin Fowler网站上的演示模式.
通常可以有一个混合的单个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桌面才能与您的服务进行交互(通过交互方式查看并与您的服务表单进行交互)
| 归档时间: |
|
| 查看次数: |
12366 次 |
| 最近记录: |