繁体   English   中英

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

[英]How do I use RestartManager to restart explorer.exe with Windows Installer custom action?

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

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

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

我停留在这一点上,不知道该怎么做才能做。 我唯一不确定的是“ 0”是否可以是从RmStartSession()返回的正确会话句柄,错误代码为0(成功)。 假设这是错误的,我将可执行文件设置为也接受Windows Installer在InstallValidate之前创建的RmSessionKey。 我用它来调用我的可执行文件作为延迟动作。 在这种情况下,我收到RmShutdown的4c3错误,这似乎是无效的错误代码。

悬崖:有一个单独的.exe使用RestartManager API来关闭,重新启动explorer.exe可以在不与Windows Installer一起运行时使用,但是结合使用时会损坏。 RmRestart()的错误代码为160。 想出办法来使它起作用。 如果人们愿意,我可以提供代码段...

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

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

与其创建一个单独的可执行文件来注册explorer.exe并关闭它,不如创建一个MSI DLL自定义操作。 所有这些DLL必须具有一个功能,该功能注册将要重启的explorer.exe并使用Windows Installer提供的现有重启管理器会话(默认情况下)。 然后在您的安装程序中,添加MsiFilesInUse对话框,您会很方便。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM