Вот настоящий совок: сервис - сервис, сервис.Это мой девиз.Под этим я подразумеваю, что мне все равно, используете ли вы C ++ EXE, VB exe, C # EXE, какой-нибудь исполняющий EXE-файл хоста, такой как SrvAny.exe ... все они реализуют один и тот же API для взаимодействия со службойуправляющий
Итак, SrvAny будет вызван SCM и получит команду запуска.В этот момент он будет читать значения реестра и знать, как запустить другой EXE или скрипт.Когда SrvAny получает вызов Stop, он собирается завершить ваш процесс и сообщить о остановке SCM.
Так работает служба.Давайте поговорим о том, как его установить.Существует множество способов программно создать службу (SC, InstSrv.exe, пользовательские действия класса установщика и т. Д.), Но с точки зрения MSI ни один из них никогда не нужен.Установщик Windows содержит таблицы ServiceInstall и ServiceControl, а также стандартные действия для запуска, остановки, создания и удаления служб Windows.Иногда, например, в случае с SrvAny.exe, вы получаете некоторые требования к установщику, которые невозможно выразить с помощью этих таблиц, и в этом случае вы используете таблицу реестра.Для SrvAny.exe это требование для создания ключа Parameters с данными реестра, который учит SrvAny.exe, что на самом деле вызывать при запуске.
Вот пример в WiX для использования SrvAny.exe для запуска сценария NodeJs какуслуга:
<Component Id="c1" Guid="redacted">
<File Id="f1" Source="$(var.SourceDir)\srvany.exe" KeyPath="yes" />
<ServiceInstall Id="si1" DisplayName="MyService" Description="MyService" Name="MyService" Start="auto" Type="ownProcess" Vital="no" ErrorControl="normal" Account="NT AUTHORITY\NetworkService" />
<ServiceControl Id="sc1" Name="MyService" Remove="both" Stop="both" Start="install" Wait="yes" />
<RegistryValue Id="reg1" Root="HKLM" Key="SYSTEM\CurrentControlSet\Services\MyService\Parameters" Name="Application" Type="string" Value="node "[#f2]"" Action="write" />
</Component>
<Component Id="c2" Guid="redacted" KeyPath="yes">
<File Id="f2" Source="$(var.SourceDir)\server.js" />
</Component>