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