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 や 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>
4

1 に答える 1

0

インストールが実行されていて、メッセージまたは sth が表示されているかどうかを確認するために、「ブートストラップ」を作成してみませんか。そうしないと。または、ユーザーに他のインストールをキャンセルさせるか、ユーザーに「空きスロット」を待つようにさせます...これは、私の意見では、msi で行うよりも優れています。

于 2013-07-12T08:14:35.933 に答える