0

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

1 回答 1

0

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

于 2013-07-12T08:14:35.933 回答