Как использовать RestartManager для перезапуска explorer.exe с настраиваемым действием установщика Windows? - PullRequest
1 голос
/ 08 августа 2011

У меня есть установщик, который предлагает пользователям перезагрузить компьютер после установки.Я бы предпочел, чтобы пользователь не перезагружал свой компьютер в этом случае, и чтобы explorer.exe просто перезапускал себя, используя API RestartManager, предоставляемый с Windows Vista и выше.

Я создал отдельный исполняемый файл, который копируется влокальный компьютер во время установки и запускается после этого.Отдельный исполняемый файл регистрирует файл explorer.exe, закрывает его и перезапускает на основе этого кода: http://msdn.microsoft.com/en-us/library/aa373681%28v=VS.85%29.aspx. Когда исполняемый файл запускается отдельно от программы установки, он работает как задумано.Но когда он запускается как пользовательское действие как часть пакета MSI, созданного с помощью InstalShield, он закрывает файл explorer.exe, но не перезапускает его.

Я всегда получаю код ошибки 160 для RmRestart, когда он запускается с установщиком.Документы говорят, что это код ошибки, означающий, что были предоставлены неверные аргументы.(http://msdn.microsoft.com/en-us/library/aa373665%28v=vs.85%29.aspx). Я вполне уверен, что мои аргументы не являются недействительными, поскольку они работают, когда исполняемый файл запускается отдельно от установщика Windows.

Я застрял на этом этапе и не уверен, что еще нужно сделать, чтобы получить этоЕдинственное, в чем я не уверен, это то, что «0» может быть правильным дескриптором сеанса, возвращенным из RmStartSession () с кодом ошибки 0 («Успех»). Предполагая, что это не так, я настроил свой исполняемый файл так, чтобы он также принималRmSessionKey, созданный установщиком Windows до InstallValidate, и я использую его для вызова моего исполняемого файла как отложенного действия. В этом случае я получаю ошибку 4c3 для RmShutdown, которая представляется неверным кодом ошибки.

Скалы: есть отдельный .exe, который использует RestartManager API для выключения, перезапустите explorer.exe, который работает, когда не запускается с помощью установщика Windows, но при объединении он ломается. Видя код ошибки 160 для RmRestart ().попытайтесь заставить это работать. Я могу предоставить фрагменты кода, если люди хотят ...

Спасибо за любыепожелания / комментарии.

1 Ответ

1 голос
/ 04 апреля 2012

В итоге я нашел решение этой проблемы ...

Вместо создания отдельного исполняемого файла, который регистрирует файл explorer.exe и завершает его работу, создайте настраиваемое действие библиотеки MSI DLL. Все, что нужно этой DLL, - это единственная функция, которая регистрирует файл explorer.exe для перезапуска и использования существующего сеанса менеджера перезапуска, предоставляемого установщиком Windows (по умолчанию). Затем в вашем установщике добавьте диалоговое окно MsiFilesInUse, и все будет хорошо.

Теперь, когда установщик запускается, он запускает сеанс менеджера перезапуска, вызывает ваш MSI DLL CA и добавляет explorer.exe в список. Отображается список, и пользователю предоставляется возможность закрыть или отложить закрытие приложений.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...