WiX: Как немедленно перезапустить explorer.exe?

Я новичок в упаковке программного обеспечения. Я использую cpack + Wix. Я пытался найти полезную информацию или хорошую документацию по util:RestartResource, но не смог найти ответ на свой вопрос.

Проблема: мне нужно установить расширение ShellExtension, которое требует перезапуска explorer.exe после установки некоторых значений реестра. Поэтому я использую команду (https://wixtoolset.org/documentation/manual/v3/xsd/util/restartresource.html):

<util:RestartResource ProcessName="explorer.exe"/>

Все работает почти так, как ожидалось. Explorer.exe будет уничтожен, как и ожидалось, но перезапуск explorer.exe будет запущен после того, как пользователь завершит установку. Это неприятно, потому что explorer.exe исчезает, пока пользователь не нажмет кнопку завершения установки. Я хотел бы прямой перезапуск проводника после того, как значения реестра были установлены. Я знаю, что это должно быть возможно, потому что, если WiX сам запускает перезапуск explorer.exe, он будет выполнен немедленно и не будет ждать завершения установки. В чем хитрость? Я уже пробовал CustomActions и размещал util:RestartResource в другом месте кода WiX (я в отчаянии).

[EDIT] Я анализирую журналы установки. И я понял, что по умолчанию Restart Manager вызывается в начале прогресса и закрывается перед финальным диалогом. Если я добавлю ProcessName в RestartResource, он откроет другой диспетчер перезапуска, который закрылся после последнего диалога. Нужно выяснить, как вызвать RestartResource как RestartResource по умолчанию.

[EDIT2] Думаю, util:RestartResource содержит ошибки. На данный момент я сканирую код реализации WiX и документацию MSI, и обычно вы должны зарегистрировать все RestartResources до состояния «InstallValidate». И это именно то, что WiX пытается сделать в UtilExtension_Platform.wxi:

  <Fragment>
    <CustomAction Id="WixRegisterRestartResources$(var.Suffix)" BinaryKey="WixCA" DllEntry="WixRegisterRestartResources$(var.Suffix)" Execute="immediate" Return="check" SuppressModularization="yes" />

    <InstallExecuteSequence>
      <Custom Action="WixRegisterRestartResources$(var.Suffix)" Before="InstallValidate" Overridable="yes" />
    </InstallExecuteSequence>
  </Fragment>

Потому что после этого состояния MsiRestartManagerSessionKey будет завершен. И WiX пытается использовать этот ключ в случае регистрации RestartResource. Но в журналах я вижу, что мой вызов util:RestartResource всегда будет выполняться после состояния «InstallValidate». И журнал уже говорит в этот момент, что MsiRestartManagerSessionKey был завершен ранее (после состояния «InstallValidate»). Это с моей точки зрения противоречит политике MSI.

[EDIT3] Это не ошибка. Я опубликую авсер.


person Trafo    schedule 21.02.2020    source источник


Ответы (2)


Способ «перезапустить проводник» - перезагрузить систему. Для этого можно использовать элемент Forcereboot.

Предлагает пользователю перезагрузить систему во время установки. Специальные действия не имеют встроенного порядкового номера и поэтому должны отображаться относительно другого действия. Предлагаемый способ сделать это — использовать атрибут «До» или «После». InstallExecute и InstallExecuteAgain могут произвольно появляться в любом месте между InstallInitialize и InstallFinalize.

Более подробную информацию можно найти здесь: https://wixtoolset.org/documentation/manual/v3/xsd/wix/forcereboot.html

Кроме того: принудительный перезапуск процесса Windows, которым вы не владеете, кажется опасным. Вероятно, это изначально не поддерживается WiX, потому что вам, вероятно, не следует этого делать. :)

person Robert P    schedule 21.02.2020
comment
Вы уверены, что он изначально не поддерживается? Поскольку WiX делает это автоматически, если ShellExtension.dll используется explorer.exe, и WiX пытается удалить dll. Затем у пользователя есть возможность перезагрузить или перезапустить проводник. Этот перезапуск происходит напрямую и не задерживается до завершения процесса удаления. Я хочу именно такого поведения. Кроме того, я не могу использовать опцию Forcereboot, потому что установщик должен иметь опцию noreboot, которая может быть опцией настройки пользователя. Кроме того, программное обеспечение, такое как SublimeText 3, по умолчанию перезапускает проводник. - person Trafo; 21.02.2020
comment
Я не уверена. Тем не менее, только потому, что это делает один установщик, не означает, что действие изначально поддерживается WiX, это просто означает, что автор установщика нашел способ заставить Windows делать то, что они хотят. Если это не изначально поддерживаемая функция, а обходной путь, со временем они, как правило, ломаются, поскольку официально не поддерживаются. - person Robert P; 21.02.2020
comment
Извините за этот вопрос, но я не нахожу намека на то, что это изначально не поддерживается. Поскольку функция util:RestartResource существует и может быть использована. И я думал, что эта функция была введена, потому что Microsoft хочет избежать перезапусков в будущем, и эта функция отлично работает с explorer.exe, потому что она снова перезапускает все открытые окна explorer.exe после перезапуска (это здорово). Я что-то пропустил? (wixtoolset.org/documentation/manual/v3/xsd/util/< /а>) - person Trafo; 21.02.2020
comment
Опять же, не уверен. :) Желаю тебе удачи! - person Robert P; 21.02.2020
comment
Рекомендуемый способ перезапуска Explorer.exe — перезагрузить систему после установки. Просто потому, что RestartResource доступен, на самом деле не означает, что вы должны перезапустить выделенный процесс Windows как часть. - person Doc; 22.02.2020
comment
Я узнал первопричину своей проблемы. RestartManager не имеет области действия. Любой процесс, который планируется перезапустить, будет перезапущен после завершения установки. Но последнее окно ExitDialog, к сожалению, все еще является частью установки. Таким образом, установка завершается после того, как пользователь нажмет кнопку «Готово». :( И, кажется, невозможно показать GUI после завершения установки, вроде успешно установлено. На данный момент единственное решение - пропустить ExitDialog. - person Trafo; 24.02.2020

Невозможно делать то, что я хочу, с помощью util:RestartResource. Потому что util:RestartResource записывает в базу данных установки, какой процесс необходимо перезапустить. (положение util:RestartResource внутри xml-файла не влияет на запланированное завершение работы и перезапуск)

Существует CustomAction, который вызывает WixRegisterRestartResources (часть WixUtilExtension.dll) перед состоянием "InstallValidate". Это именно то, что необходимо для регистрации процесса в RestartManager MSI с помощью MsiRestartManagerSessionKey. Процессы перезапуска будут извлечены из базы данных установки. RestartManager MSI завершает работу всех процессов после состояния InstallValidate. К сожалению, он перезапускает все процессы, когда процесс MSI полностью завершен, а не раньше. Это означает, что он всегда будет запускаться после того, как пользователь нажмет кнопку «Готово» в FinalDialog. Его нельзя изменить, потому что это логика внутри рабочего процесса установщика MSI.

Я попытался реализовать настраиваемое действие, которое регистрирует себя в MsiRestartManagerSessionKey и пытается перезапустить все процессы перед EndDialog, но RestartManager MSI отклоняет все виды этих запросов (какая-то ошибка сеанса). И это часть дизайна MSI, поскольку установщик MSI удаляет свойство MsiRestartManagerSessionKey после состояния InstallValidate. Они не хотят, чтобы вы могли получить доступ к RestartManager после состояния InstallValidate.

В конце я реализовал свой собственный RestartManager с CustomAction на C++, а позже, когда я понял, что код на C# стал более чистым, я реализовал его на C#. Хорошее объяснение того, как это может работать, вы найдете здесь: http://community.bartdesmet.net/blogs/bart/archive/2006/11/12/Exploring-Windows-Vista_2700_s-Restart-Manager-in-C_2300_.aspx< /а>

person Trafo    schedule 28.02.2020