WiX:使用自定义操作检查当前正在运行的安装

WiX:使用自定义操作检查当前正在运行的安装,wix,installation,windows-installer,Wix,Installation,Windows Installer,我尝试使用自定义的操作(用C++编写的代码)检查我的安装程序是否在安装时已经运行。 代码是: #include <Windows.h> #include <Msi.h> #include <MsiQuery.h> #include <tchar.h> #pragma comment(linker, "/EXPORT:CheckMultipleInstances=_CheckMultipleInstances@4") #pragma comment

我尝试使用自定义的操作(用C++编写的代码)检查我的安装程序是否在安装时已经运行。 代码是:

#include <Windows.h>
#include <Msi.h>
#include <MsiQuery.h>
#include <tchar.h>

#pragma comment(linker, "/EXPORT:CheckMultipleInstances=_CheckMultipleInstances@4")
#pragma comment(lib, "msi.lib")

extern "C" UINT __stdcall CheckMultipleInstances(MSIHANDLE hInstall)
{
CreateMutexA(0, FALSE, "SIERRAINSTALL_MUTEX");
if (GetLastError() == ERROR_ALREADY_EXISTS)
    MsiSetProperty (hInstall, "INSTALLRUNNING", "1");

return ERROR_SUCCESS;
}
#包括
#包括
#包括
#包括
#pragma注释(链接器,“/EXPORT:CheckMultipleInstances=_CheckMultipleInstances@4")
#pragma注释(lib,“msi.lib”)
外部“C”单元调用检查多个实例(MSI)
{
CreateMutexA(0,FALSE,“sierraanstall_MUTEX”);
如果(GetLastError()==错误\u已存在)
MsiSetProperty(hInstall,“INSTALLRUNNING”,“1”);
返回错误\成功;
}
相关WiX代码如下所示:

<CustomAction Id='CheckOtherInstalls' BinaryKey='InstallCheck' DllEntry='CheckMultipleInstances'/>
<CustomAction Id='RefuseInstall' Error='Sierra Installer is already running.'/>

<Custom Action='CheckOtherInstalls' After='CostFinalize'/>
<Custom Action='RefuseInstall' After='CheckOtherInstalls'>INSTALLRUNNING = "1" AND NOT Installed</Custom>

INSTALLRUNNING=“1”且未安装
问题是,无论我何时计划此自定义操作,它实际上都不会执行它,直到用户在安装程序上说“安装”

我希望在安装程序启动时,甚至在显示欢迎屏幕之前(如果可能的话)执行此自定义操作

我怎样才能做到这一点

编辑::这是我的解决方案(ish) 当用户单击欢迎对话框上的“下一步”时,我触发了我的自定义操作。不要随意摆弄installexecutesequence或installUisequence,这对于我来说是一个很好的折衷方案

如果有人感兴趣,这就是我的想法:

<UI Id='MyWixUI_Mondo'>

  <UIRef Id='WixUI_Mondo'/>

  <Publish Dialog='WelcomeDlg' Control='Next' Event="DoAction" Value="CheckOtherInstalls">1</Publish>
  <Publish Dialog='WelcomeDlg' Control='Next' Event="DoAction" Value="RefuseInstall">INSTALLRUNNING = "1"</Publish>

1.
INSTALLRUNNING=“1”
为什么不创建一个“引导程序”来检查安装是否正在运行并显示消息或其他内容。或者让用户取消其他安装,或者让用户等待“空闲插槽”。。。
在我看来,这比在微星上做要好。

你想解决什么问题?Windows Installer确实确保一次只运行一个安装,即关键部件。执行互斥:这与其说是答案,不如说是注释。