Delphi XE2 新服务 - 为什么包含这些 VCL 单元?

4

我有点疑惑,为什么在Delphi XE2中创建新的服务应用程序时,会包含这3个可视化组件单元?

Vcl.Controls
Vcl.Dialogs
Vcl.Graphics

据我所知,这些单元中没有任何一个是服务所必需的。我能看出来,图形单元可能被用于某种图像处理,但这取决于开发人员对它的实现。为什么在新服务应用程序中自动包含这些单元呢?如果我删除它们,也不会有任何问题...或者会有吗?

1
不是所有的东西都是可视化的... - Tony Hopkinson
1
我不知道,但只有一种方法可以找出来,那就是注释它们! - user497849
已经拥有,如上所述,我可以移除它们而不会出现任何问题。但我真的很困惑为什么它们一开始会被包含在内。 - Jerry Dodge
+1 好问题 - “没有出现错误”并不等同于“以后不会出现错误” - 如果单元有初始化,并且它们必须运行一些您的测试尚未到达的特定代码... - mjn
2
删除它们。你不需要或想要它们。 - David Heffernan
显示剩余4条评论
1个回答

8
这是由IDE代码生成器添加的,"以防万一"... IDE主要创建表单,因此即使您的服务不需要UI,它也会将其添加到您的服务模块中。
有趣的是,自Windows Vista/Seven以来,服务无法再向桌面发送GDI消息,即无法与之交互。因此,绝对没有可能从Windows服务中使用对话框或UI控件。
事实上,甚至SvcMgr.pas链接到Forms.pas + Dialogs.pas单位。因此,在您自己的单位中删除引用将继续链接这些单位。
似乎需要Forms.pas + Dialogs.pas单位才能在命令行安装服务时显示一些潜在的错误消息。
实际上,您的服务.exe不仅作为服务在后台运行。它还可以像常规应用程序一样从命令行运行,以安装/卸载/启动/停止服务。
你可以查看我们在Delphi中较轻量级的Windows服务实现 - 但不是相同的功能 - 只是用于玩弄API。此版本不链接到Forms.pasDialogs.pas单元。

似乎SvcMgr.pas需要Forms.pas和Dialogs.pas单元来在命令行上安装服务时显示一些潜在的错误消息。SvcMgr使用它们是可以的,但项目模板代码没有使用它们的理由。许多其他单元将被使用,而不会出现在项目模板中。 - David Heffernan
@DavidHeffernan 当然,在项目模板中没有使用它们的理由 - 但是,说实话,链接整个对话框和表单单元会向服务可执行文件添加大量不必要的代码!这么多的代码只为了那么点东西(即使只需要一个或两个函数,新的RTTI也使得这些单元变得非常沉重)。 - Arnaud Bouchez
1
SvcMgr.pas 单元依赖于 Forms.pas 单元,因为 SvcMgr.TApplication 在内部访问 Forms.TApplication。虽然我不知道为什么 SvcMgr.pas 使用了 Dialogs.pas - Remy Lebeau
@jerry 你为什么要担心这个?虽然在可执行文件中有很多浪费的代码看起来很烦人,但如果从未调用它,它就不会被分页到内存中,所以实际上并不重要。 - David Heffernan
我之所以问这个问题,是因为这是一个非常奇特的发现。我的最初问题与SvcMgr单元内可能声明的内容无关,我只是想知道为什么这三个单元会自动包含在新服务中,因为它们很可能永远不会被服务使用。就这些。 - Jerry Dodge
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接