Как работает этот оператор «если нет» без скобок в новом приложении-службе? - PullRequest
0 голосов
/ 29 ноября 2018

При создании новой службы Windows в Delphi в нее вставляется следующее:

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, так как нет необходимости беспокоитьсяс сервером 2003. Я просто хотел бы понять, что этот код на самом деле предназначен, чтобы сделать так, как он написан.

1 Ответ

0 голосов
/ 29 ноября 2018

Как поясняется в комментарии, вставленном в источник проекта при создании приложения-службы, DelayInitialize существует по определенной причине: требование вызвать StartServiceCtrlDispatcher до CoRegisterClassObject.Полагаю, будет ли вам необходимо установить его или нет, на самом деле все будет зависеть от того, нужно ли вам звонить CoRegisterClassObject, а не от того, нацелен ли вы на сервер 2003 или нет (*) .Я не ожидаю, что этот комментарий будет обновляться с каждой новой версией сервера.YMMV, может потребоваться тестирование.

Предполагается, что вы используете System.InitProc для вызова CoRegisterClassObject (**) , аналогично тому, как вызов CoInitializeEx выполняетсяComObj.pas.InitProc вызывается из Vcl.Forms.Application.Initialize, который вызывается из Vcl.SvcMgr.TServiceApplication.Initialize.

Теперь, когда Vcl.SvcMgr.TServiceApplication.Installing возвращает значение true, это означает, что StartServiceCtrlDispatcher не будет вызываться.Потому что основной поток не собирается соединяться с диспетчером управления службами.Вместо этого он либо установит, либо удалит службы, а затем завершит работу.Тогда необходимость в любой отложенной инициализации станет недействительной, и фактически отложенная инициализация не может быть запущена, поскольку ни один поток службы не будет запускать (***) .

И вот почему выражение написано так, как оно есть, пропущенные / пропущенные скобки отсутствуют.


(*) У D2007 есть комментарий, когда2003 R2 - последний сервер.

(**) Из комментария в источнике проекта:

Требуется Windows 2003 ServerStartServiceCtrlDispatcher, вызываемый перед CoRegisterClassObject, который может вызываться косвенно с помощью Application.Initialize.

(***) Здесь вызывается отложенная инициализация, защищаемая флагомесли в исполняемом файле более одной службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...