Предложить пользователю закрыть приложение во время удаления (в WiX) - PullRequest
7 голосов
/ 02 апреля 2009

Я использую установщик Windows XML 3.0 (WIX3) для установки некоторого программного обеспечения.

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

Я добавил следующий код в мой installer.wxs файл:

<InstallExecuteSequence>
  <Custom Action="WixCloseApplications" Before="RemoveFiles" />
</InstallExecuteSequence>

<util:CloseApplication Id="CloseFoobar"
                       CloseMessage="no"
                       Description="FooBar is still running!"
                       ElevatedCloseMessage="no"
                       RebootPrompt="no"
                       Target="foobar.exe" />

Но это не работает - еще хуже, он показывает диалоговое окно с запросом перезагрузки во время установки !

Как правильно это сделать?

Ответы [ 6 ]

7 голосов
/ 02 апреля 2009

Насколько я помню, этого должно быть достаточно, чтобы добавить следующие ссылки в ваш пользовательский интерфейс:

<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />

Приложение CloseApplication предназначено только для закрытия приложений во время установки, но оно содержит ошибки (по крайней мере, когда я пытался сделать это несколько месяцев назад, может быть, оно исправлено сейчас?)

К сожалению, это снова пример очень плохой документации по WiX, даже не описаны стандартные сценарии установки / удаления, подобные этому.

1 голос
/ 31 марта 2015

для примера, как использовать closeapplication, перейдите по этой ссылке: проект wix github, модульные тесты

Чтобы показать диалоговое окно с подсказкой, вы можете использовать: <util:CloseApplication Id="CloseIE" Target="iexplore.exe" PromptToContinue="yes" Description="Test" />

1 голос
/ 03 апреля 2009

Пару дней назад в списке рассылки wix-users был задан похожий вопрос. Ответ был дан:

Так работает Windows Pre-Vista и менеджер перезапуска. Там должно быть окно верхнего уровня имеется в наличии. Приложение в трее не сосчитать.

В архиве wix-пользователей также есть несколько тем .

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

Я тоже сталкивался с этой проблемой. Изменение атрибута «До» на «InstallValidate» сработало для меня.

<Custom Before="InstallValidate" Action="WixCloseApplications"/>
0 голосов
/ 20 мая 2015

Шей ответ правильный. Последние версии установщика Windows ведут себя именно так. Установщик Windows сталкивается с большими трудностями, чтобы убедиться, что вы можете избежать перезагрузки во время удаления путем повторного сопоставления используемых DLL-файлов и т. Д. В общем, работающее приложение может продолжать работать после удаления, и некоторая очистка произойдет, когда приложение выключается, остальное после следующей перезагрузки. Дело в том, что если установщик Windows может переместить используемые двоичные файлы в другое место, оставьте все запущенные приложения и замените те, которые были использованы (но перераспределение памяти переназначено), и все, что требуется, это удалить немного ненужного мусора при следующей перезагрузке, зачем форсировать перезагрузку? Нет необходимости показывать диалог использования файлов, чтобы не возникала ситуация.

Это может вызвать проблемы, если приложение пытается получить доступ к удаленному файлу, но я предполагаю, что риск рассматривается как низкий. Если приложению необходимо знать, что происходит удаление, интеграция с Restart Manager должна сработать - Windows сообщит, что удаление происходит. Иначе опять Шей прав. Напишите пользовательское действие удаления, если необходимо, чтобы приложение закрылось.

0 голосов
/ 03 апреля 2009

Можете ли вы проверить журналы удаления (, вот как их включить ), насколько я помню, установщик Windows переведет ваши файлы в состояние ожидания удаления и попросит перезагрузку в конце.
Также вы можете написать простое пользовательское действие, которое убьет ваш процесс.

...