如果在新服务应用程序中没有括号,该“如果不是”语句如何工作?

时间:2018-11-28 23:00:38

标签: delphi if-statement service

在Delphi中创建新的Windows服务时,它将插入以下内容:

if not Application.DelayInitialize or Application.Installing then
  Application.Initialize;

作者并没有打扰包括括号,因此我正在设法解决这个问题。转换为:

if (not Application.DelayInitialize) or Application.Installing then
  Application.Initialize;

据我了解,如果Application.DelayInitializeApplication.Installing均为True,那么它将继续运行Initialize服务应用程序。我不明白为什么为什么在这种情况下会被初始化-我很确定它不应该被初始化。

有人可以给我一些澄清吗?


另一方面,我不需要启用DelayInitialize,因为不必担心Server2003。我只是想了解这段代码实际上是如何实现其编写方式的。

1 个答案:

答案 0 :(得分:2)

正如创建服务应用程序时插入项目源中的注释所解释的那样,存在DelayInitialize的原因是特定的:要求在StartServiceCtrlDispatcher之前调用CoRegisterClassObject。我想您是否需要设置它,实际上取决于您是否需要调用CoRegisterClassObject,而不是是否要定位Server2003。(*) IOW,我不希望每个新的服务器版本都会更新该注释。 YMMV,可能需要测试。

此处的隐含设计是您使用System.InitProc来调用CoRegisterClassObject (**),类似于ComObj进行CoInitializeEx调用。 pas。 InitProcVcl.Forms.Application.Initialize调用Vcl.SvcMgr.TServiceApplication.Initialize

现在,当Vcl.SvcMgr.TServiceApplication.Installing返回true时,这意味着将不会调用StartServiceCtrlDispatcher。因为主线程将不与服务控制管理器连接。相反,它将安装或卸载服务,然后退出。这样一来,任何延迟初始化的需求都将变得无效,并且由于没有服务线程将运行(***),因此实际上延迟延迟初始化无法运行。

所以这就是为什么表达式是这样写的,没有被遗忘/缺少括号的原因。


(*)D2007带有注释,此时2003 R2是最后一个服务器。

(**)来自项目源中的注释:

Windows 2003 Server要求在CoRegisterClassObject之前调用StartServiceCtrlDispatcher,它可以由Application.Initialize间接调用。

(***)在这里调用延迟的初始化,并在可执行文件中有多个服务的情况下用标志加以保护。