Wix: остановка службы Windows при удалении - PullRequest
7 голосов
/ 17 июня 2009

Когда я удаляю свой сервис, я получаю сообщение об ошибке, в котором говорится, что я должен остановить тот или иной сервис перед удалением. Это неудовлетворительно - деинсталлятор должен автоматически остановить его.

Я нашел сообщение в блоге или группе новостей об этом месяце назад и заставил его работать должным образом, но теперь он перестал работать для меня. И у меня нет ссылки на пост ... может, кто-то еще знает, где это? :) Я думаю, я изменил некоторые тонкие вещи, и это перестало работать. Я нахожу Wix чрезвычайно трудным для устранения неполадок.

Я использую следующую команду include для получения свойства X_ WIN_ SERVICE_ NAME (извините, я не знаю, как избежать _ экранирования здесь) из реестра. Это не имеет значения при установке, потому что в этом случае я явно устанавливаю его с помощью входного файла. Это включение используется перед любыми компонентами в моем файле wxs.

<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">

<?ifndef SetupXWinServiceRegistryProperties ?>
<?define SetupXWinServiceRegistryProperties ?>

<?define XWinServiceRegistryKey='Software\X\Y'?>

<Property Id="X_WIN_SERVICE_NAME">
  <RegistrySearch Id="XWinServiceNameSearch"
                    Root="HKLM"
                    Key="$(var.XWinServiceRegistryKey)"
                    Name="ServiceName"
                    Type="raw"/>
</Property>

<?endif?>
</Include>

Для сохранения значения реестра при установке используется следующий компонент include:

<Include xmlns="http://schemas.microsoft.com/wix/2006/wi">

<?ifndef WriteXWinServiceRegistryProperties ?>
<?define WriteXWinServiceRegistryProperties ?>

<Component Id="CompWriteXWinServiceRegistryProps"
  Guid="some guid">

<!-- Write properties to the registry. Then they will be 
       accessable during uninstall. -->

<RegistryValue Root="HKLM"
   Key="$(var.XWinServiceRegistryKey)"
   Name="ServiceName"
   Type="string"
   Value="[X_WIN_SERVICE_NAME]"
   Action="write" />

</Component>

<?endif?>

</Include>

Я проверил свою систему после установки, и там правильно написано значение реестра. Часть в моем компоненте, где настраивается служба, выглядит так:

          <ServiceInstall Id="ServiceInstallXWinService"
                          Name="[X_WIN_SERVICE_NAME]"
                          Start="auto"
                          DisplayName="xxx"
                          Description="yyy"
                          Account="[X_WIN_SERVICE_USER]"
                          Password="[X_WIN_SERVICE_PASSWORD]"
                          Type="ownProcess"
                          ErrorControl="normal"
                          Vital="yes" />

          <ServiceControl Id="ServiceInstallXWinService" 
                          Name="[X_WIN_SERVICE_NAME]"
                          Stop="both"
                          Remove="uninstall"
                          Wait="yes" />

Есть идеи?

1 Ответ

4 голосов
/ 17 июня 2009

Вы уверены, что для свойства X_WIN_SERVICE_NAME установлено правильное значение при удалении. Используйте подробный файл журнала, чтобы убедиться, что поиск правильно устанавливает значение. Все выглядит хорошо (хотя я не знаю, почему вы помещаете все в файлы «Включить», а не просто используете фрагменты).

...