2013-07-11 50 views
0

我正尝试使用自定义操作(使用本机C++代码编写)来检查安装程序是否已在运行。WiX:使用自定义操作检查当前正在运行的安装

代码是:

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

#pragma comment(linker, "/EXPORT:[email protected]") 
#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或installUsequence的工作,这最终成为我的目的一个很好的中间地带。

如果有人有兴趣,这是我想出了:

+0

你想解决什么问题? Windows Installer确保一次只运行一个安装 - 即关键部分,即。 –

+0

_MSIExecute Mutex:http://msdn.microsoft.com/en-us/library/windows/desktop/aa372909(v=vs.85).aspx –

回答

0

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

+0

这更多的是评论,而不是答案。 –

相关问题