Как поясняется в комментарии, вставленном в источник проекта при создании приложения-службы, 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.
(***) Здесь вызывается отложенная инициализация, защищаемая флагомесли в исполняемом файле более одной службы.