【问题标题】:Delphi XE2 New Service - Why does it include these VCL units?Delphi XE2 新服务 - 为什么包含这些 VCL 单元?
【发布时间】:2012-03-06 02:47:17
【问题描述】:

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

Vcl.Controls
Vcl.Dialogs
Vcl.Graphics

据我所知,这些单元中没有任何服务需要。我可以看到图形单元可能用于某种图像处理,但这是开发人员实现它的问题。这些单元自动包含在新的服务应用程序中是否有某些原因?如果我删除它们,它不会伤害任何东西......或者是吗?

【问题讨论】:

  • 并非所有内容都是可视的......
  • @TonyHopkinson 明白了,但我仍然看不到任何必须显示对话框的理由,因为服务是不可见的,并且永远不应该显示任何对话框。而且没有什么可画的,那为什么还要包括图形呢?
  • 我不知道,但只有一种方法可以找出答案,评论他们!
  • 已经有了,如前所述,我可以删除它们并且没有任何损坏。我真的很困惑为什么他们会被包括在首位。
  • 删除它们。你不需要也不想要它们。

标签: delphi service delphi-xe2 vcl


【解决方案1】:

这是由 IDE 代码生成器添加的,“以防万一”... IDE 主要是创建表单,所以它会添加到你的服务模块中,即使你的服务中不需要 UI。

有趣的是,从 Windows Vista/7 开始,服务无法再将 GDI 消息发送到桌面,即与其交互。因此,绝对不可能使用 Windows 服务中的对话框或 UI 控件。

事实上,即使SvcMgr.pas 链接到Forms.pas + Dialogs.pas 单位。因此,删除您自己单位中的引用将继续链接这些单位。

似乎SvcMgr.pas 需要Forms.pas + Dialogs.pas 单位来在命令行上安装服务时显示一些潜在的错误消息。

事实上,您的服务.exe 不只是在后台运行,作为服务。它也可以像常规应用程序一样从命令行运行,以安装/卸载/启动/停止服务。

您可以查看our lighter implementation of Windows services in Delphi - 但功能不一样 - 只是一些与 API 相关的东西。此版本未链接到 Forms.pasDialogs.pas 单位。

【讨论】:

  • SvcMgr.pas 似乎需要 Forms.pas + Dialogs.pas 单元来在命令行上安装服务时显示一些潜在的错误消息。 没关系让 SvcMgr 使用它们,但项目模板代码没有理由使用它们。很多其他的单元将被使用,而不会出现在项目模板中。
  • @DavidHeffernan 当然,没有理由在项目模板中使用它们 - 但是,老实说,链接整个 Dialogs 和 Forms 单元会为服务可执行文件添加很多不必要的代码!如此之少(即使只需要一两个功能,新的 RTTI 更是如此,它使这些单元根本不发光)。
  • 我想一个解决方案(与我之前的问题相反)是制作 SvcMgr 的完整副本,删除这些单元,然后仅将 SvcMgr 所需的代码直接添加到单元中。
  • SvcMgr.pas 单元依赖于Forms.pas 单元,因为SvcMgr.TApplication 在内部访问Forms.TApplication。不过,我不知道为什么SvcMgr.pas 使用Dialogs.pas
  • @jerry 你为什么要担心这个? exe 中有这么多浪费的代码感觉很烦人,但如果它从未被调用,它就不会被分页到内存中,所以这实际上并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2012-08-25
  • 2012-04-27
相关资源
最近更新 更多