在Delphi中创建新的Windows服务时,它将插入以下内容:
if not Application.DelayInitialize or Application.Installing then
Application.Initialize;
作者并没有打扰包括括号,因此我正在设法解决这个问题。转换为:
if (not Application.DelayInitialize) or Application.Installing then
Application.Initialize;
据我了解,如果Application.DelayInitialize
和Application.Installing
均为True
,那么它将继续运行Initialize
服务应用程序。我不明白为什么为什么在这种情况下会被初始化-我很确定它不应该被初始化。
有人可以给我一些澄清吗?
另一方面,我不需要启用DelayInitialize
,因为不必担心Server2003。我只是想了解这段代码实际上是如何实现其编写方式的。
答案 0 :(得分:2)
正如创建服务应用程序时插入项目源中的注释所解释的那样,存在DelayInitialize
的原因是特定的:要求在StartServiceCtrlDispatcher
之前调用CoRegisterClassObject
。我想您是否需要设置它,实际上取决于您是否需要调用CoRegisterClassObject
,而不是是否要定位Server2003。(*) IOW,我不希望每个新的服务器版本都会更新该注释。 YMMV,可能需要测试。
此处的隐含设计是您使用System.InitProc
来调用CoRegisterClassObject
(**),类似于ComObj进行CoInitializeEx
调用。 pas。 InitProc
从Vcl.Forms.Application.Initialize
调用Vcl.SvcMgr.TServiceApplication.Initialize
。
现在,当Vcl.SvcMgr.TServiceApplication.Installing
返回true时,这意味着将不会调用StartServiceCtrlDispatcher
。因为主线程将不与服务控制管理器连接。相反,它将安装或卸载服务,然后退出。这样一来,任何延迟初始化的需求都将变得无效,并且由于没有服务线程将运行(***),因此实际上延迟延迟初始化无法运行。
所以这就是为什么表达式是这样写的,没有被遗忘/缺少括号的原因。
(*)D2007带有注释,此时2003 R2是最后一个服务器。
(**)来自项目源中的注释:
Windows 2003 Server要求在CoRegisterClassObject之前调用StartServiceCtrlDispatcher,它可以由Application.Initialize间接调用。
(***)在这里调用延迟的初始化,并在可执行文件中有多个服务的情况下用标志加以保护。