如何使用RestartManager通过Windows Installer自定义操作重新启动explorer.exe?

时间:2011-08-08 06:50:11

标签: c++ windows-installer explorer shutdown restart

我有一个安装程序,提示用户在安装后重新启动计算机。在这种情况下,我宁愿不让用户重新启动计算机,并且只使用随Windows Vista及更高版本提供的RestartManager API重新启动explorer.exe。

我创建了一个单独的可执行文件,在安装过程中将其复制到本地计算机并在此之后运行。单独的可执行文件注册explorer.exe,将其关闭,然后根据以下代码重新启动它:http://msdn.microsoft.com/en-us/library/aa373681%28v=VS.85%29.aspx。当可执行文件与安装程序分开运行时,它按设计工作。但是当它作为使用InstalShield创建的MSI包的一部分作为自定义操作运行时,它会关闭explorer.exe但不会重新启动它。

当RmRestart与安装程序一起运行时,我总是得到160错误代码。文档说这是一个错误代码,意味着提供了无效的参数。 (http://msdn.microsoft.com/en-us/library/aa373665%28v=vs.85%29.aspx)。我非常肯定我的论点不是无效的,因为它们在可执行文件与Windows Installer分开运行时起作用。

我陷入困境,不知道还有什么可以让它发挥作用。我唯一不确定的是,如果“0”可以是从RmStartSession()返回的正确会话句柄,错误代码为0(成功)。假设这是错误的,我设置我的可执行文件以接收在InstallValidate之前由Windows Installer创建的RmSessionKey。我用它来调用我的可执行文件作为延迟操作。在这种情况下,我收到RmShutdown的4c3错误,这似乎是一个无效的错误代码。

Cliffs:使用单独的.exe使用RestartManager API关闭,重新启动explorer.exe,该版本在未与Windows Installer一起运行时有效,但合并后会中断。查看RmRestart()的错误代码160。想出来试图让这个工作起作用。如果人们想要,我可以提供代码片段......

感谢您的任何建议/意见。

1 个答案:

答案 0 :(得分:1)

我最终找到了解决方案......

创建一个MSI DLL自定义操作,而不是创建一个单独的可执行文件来注册explorer.exe并将其关闭。所有这个DLL必须具有一个函数,它注册要重新启动的explorer.exe并使用Windows Installer提供的现有重新启动管理器会话(默认情况下)。然后在安装程序中添加MsiFilesInUse对话框,您就可以开始使用了。

现在,当安装程序运行时,它会启动重新启动管理器会话,并调用您的MSI DLL CA,并将explorer.exe添加到列表中。将显示该列表,并为用户提供关闭或推迟关闭应用程序的选项。

使用此方法可以避免向用户分发无意义的可执行文件,并简化大量编写的代码。