Параметр запуска службы параметров в установщике WiX - PullRequest
6 голосов
/ 23 марта 2010

У меня есть компонент ServiceInstall в установщике WiX, где у меня есть требование, чтобы запустить авто или запрос в зависимости от параметров, переданных в MSI.

Таким образом, рассматриваемый элемент XML является

<ServiceInstall Vital="yes"
     Name="My Windows Service"
     Type="ownProcess"
     Account="[SERVICEUSERDOMAIN]\[SERVICEUSERNAME]"
     DisplayName="My Service"
     Password="[SERVICEUSERPASSWORD]"
     Start="demand"
     Interactive="no"
     Description="Something interesting here"
     Id="Service"
     ErrorControl="ignore"></ServiceInstall>

WiX не позволит использовать PArameter для атрибута Start, поэтому я застрял с полным дублированием компонента с условием, например, /

<Component Id="ServiceDemand"
                 Guid="{E204A71D-B0EB-4af0-96DB-9823605050C7}" >
        <Condition>SERVICESTART="demand"</Condition>    
...

и полностью дублирует весь компонент с другой настройкой для запуска и другим условием.

Кто-нибудь знает более элегантное решение? Тот, где я не должен поддерживать 2 компонента, которые делают то же самое, кроме атрибута для запуска?

Ответы [ 2 ]

6 голосов
/ 23 марта 2010

Поле Start в таблице ServiceInstall не отформатировано, поэтому то, что вы вводите со свойством, не будет работать. Эта ссылка содержит несколько полезных советов, которые могут помочь вам в этом: ServiceInstall - элемент Start . Похоже, у человека, который отправил сообщение, была та же проблема. Мое любимое предложение, которое они предлагают, заключается в создании настраиваемого действия, которое выполняется перед действием InstallServices, которое изменит значение элемента Start в таблице Service Install.

Обновление: изменена ссылка на предлагаемый сайт.

0 голосов
/ 18 января 2017

К сожалению, стандартная функциональность Wix для установки и управления сервисами довольно ограничена.

Хотя это и не идеально, но это можно сделать с помощью CustomAction, например, с помощью CAQuietExec (который также удобно сохраняет вывод в файл журнала установки, если вы его используете)

  <CustomAction Id="QtExec_Install_Cmd" Property="QtExec_Install" Value="sc create [SERVICE_NAME] binPath=&quot;[INSTALLFOLDER]$(var.MAIN_EXECUTABLE)&quot; start=[SERVICE_START_FLAG]" Execute="immediate" />
  <CustomAction Id="QtExec_Install" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
  <CustomAction Id="QtExec_Uninstall_Cmd" Property="QtExec_Uninstall" Value="sc delete [SERVICE_NAME]" Execute="immediate" />
  <CustomAction Id="QtExec_Uninstall" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no" />
  <InstallExecuteSequence>
    <Custom Action="QtExec_Install_Cmd" After="CostFinalize"/>
    <Custom Action="QtExec_Install" After="InstallServices">&amp;WindowsService=3</Custom>
    <Custom Action="QtExec_Uninstall_Cmd" After="CostFinalize"/>
    <Custom Action='QtExec_Uninstall' Before="RemoveFiles">NOT &amp;WindowsService=3 AND NOT &amp;WindowsService=-1</Custom>
  </InstallExecuteSequence>

Примечание:

  • WindowsService - это название компонента

  • SERVICE_START_FLAG - это свойство, определяющее, запускать ли службу

  • [INSTALLFOLDER] $ (var.MAIN_EXECUTABLE) - это путь к исполняемому файлу

  • SERVICE_NAME - желаемое имя для службы Windows

...