自定义引导程序作为单个实例

Posted

技术标签:

【中文标题】自定义引导程序作为单个实例【英文标题】:Custom bootstrapper as single instance 【发布时间】:2013-09-16 18:25:21 【问题描述】:

我有一个自定义引导程序(Bootstrapper - Setup.exe 和自定义 BA 库 - CustomBA.dll),可以作为多个实例启动。

为了允许用户只打开一个实例,我尝试检查自定义 BA 库中的 ProcessName。我能够检查 ProcessName(Setup.exe) 但它对第一个实例本身进行了检查,并且退出自定义 BA 并不会关闭 Setup.exe。

是否有内置的 WiX 方法来检查 Bootstrapper 本身中的实例? 如果没有,有没有办法在自定义 BA 库中检查它?

【问题讨论】:

您需要获取进程的 ID 而不是名称。可能有多个 Setup.exe 正在运行,但每个都有一个唯一的 ID。尝试使用 GetCurrentProcessId 函数。查看详情:msdn.microsoft.com/en-us/library/windows/desktop/… 【参考方案1】:

如果您使用 C++ 自定义引导程序,您可以尝试创建命名互斥锁并检查此互斥锁是否存在。在我的安装程序中,我在 UI 线程中执行此检查。在这种情况下,安装程序的第二个副本会静默关闭,不会出现任何错误消息。

【讨论】:

您需要非常小心,您的互斥锁不会阻止升级的发生。您需要以升级或条件为条件来阻止相同的捆绑包 ID。

以上是关于自定义引导程序作为单个实例的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含多个 MSI 的 wix 自定义引导程序包中安装/卸载单个 msi,例如安装项目的添加/删除功能?

Wix3.7 自定义引导程序不显示主题库中的 WPF 主题

添加 Bootstrap 的副本作为自定义的起点

如何从Wix托管引导程序或自定义操作中读取某些注册表项?

自定义 WiX Burn 引导程序用户界面?

WIX、引导程序或自定义操作