Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE2新服务-为什么包括这些VCL装置?_Delphi_Service_Delphi Xe2_Vcl - Fatal编程技术网

Delphi XE2新服务-为什么包括这些VCL装置?

Delphi XE2新服务-为什么包括这些VCL装置?,delphi,service,delphi-xe2,vcl,Delphi,Service,Delphi Xe2,Vcl,我有点困惑,为什么在Delphi XE2中创建一个新的服务应用程序时,它会包括这3个可视化组件单元 Vcl.Controls Vcl.Dialogs Vcl.Graphics 据我所知,这些单位里没有任何服务需要的东西。我可以看到图形单元可能被用于某种图像处理,但这是开发人员实现它的问题。这些单元自动包含在新的服务应用程序中有什么原因吗?如果我把它们拿走,它不会伤害任何东西。。。或者是吗?这是由IDE代码生成器添加的,“以防万一”。。。 IDE主要创建表单,所以它会将其添加到您的服务模块中,即

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

Vcl.Controls
Vcl.Dialogs
Vcl.Graphics

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

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

有趣的是,自从WindowsVista/Seven以来,这些服务不再能够向桌面发送GDI消息,即与桌面交互。因此,根本不可能从Windows服务中使用对话框或UI控件

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

当服务安装在命令行上时,
SvcMgr.pas
似乎需要
Forms.pas+对话框.pas
单元来显示一些潜在的错误消息

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


您可以查看—但不是相同的功能—只是一些可以使用API的功能。此版本不链接到
表单.pas
对话框.pas
单元

并不是所有的东西都是可视的…@TonyHopkinson明白了,但我仍然不认为有任何理由必须显示对话框,例如,因为服务是不可见的,永远不应该显示任何对话框。而且没有什么可画的,那为什么包括图形呢?我不知道,但只有一种方法可以找到,评论它们!如前所述,已经有了,我可以移除它们,没有任何东西会断裂。我真的很困惑,为什么他们会被包括在第一位。删除他们。您不需要或不需要它们。SvcMgr.pas似乎需要Forms.pas+Dialogs.pas单元,以便在命令行上安装服务时显示一些潜在的错误消息。SvcMgr可以使用它们,但项目模板代码没有理由使用它们。大量的其他单元将被使用,而不会出现在项目模板中。@DavidHeffernan当然,没有理由在项目模板中使用它们-但是,老实说,链接整个对话框和表单单元会将大量不必要的代码添加到服务可执行文件中!这么少就这么多了(新的RTTI使这些装置一点也不轻,即使只需要一个或两个功能)。我想一个解决方案(与我之前的问题相反)是制作一个完整的SvcMgr副本,移除这些装置,只将SvcMgr需要的代码直接添加到单元中。
SvcMgr.pas
单元取决于
Forms.pas
单元,因为
SvcMgr.TApplication
在内部访问
Forms.TApplication
。我不知道为什么
SvcMgr.pas
使用
对话框.pas
。@jerry你为什么担心这个?exe中有这么多浪费的代码,这让人感到恼火,但如果它从未被调用,它就不会被分页到内存中,所以它实际上并不重要。