カスタム アクション (ネイティブ 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 や installUsequence をいじってもうまくいきませんでした。
誰かが興味を持っているなら、これは私が思いついたものです:
<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>