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

时间:2013-07-11 22:11:53

标签: wix installer windows-installer

我正在尝试使用自定义操作(用本机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;
}

相关的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>

问题是,无论我何时安排此自定义操作,它都不会在用户在安装程序上说“安装”之后才执行它。

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

我该如何做到这一点?

编辑::这是我的解决方案(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 个答案:

答案 0 :(得分:0)

为什么不创建“引导程序”来检查安装是否正在运行并显示消息或某事。其他。或者让用户取消其他安装,或者让用户等待“空闲插槽”...... 在我看来,这比在msi中做得更好。