1

DoAction CustomAction からエラー ダイアログを使用しようとしています。を使用できないことはわかっていますがMsiProcessMessage、現時点では を使用してMessageBoxいますが、これが推奨されないことはわかっています。DoAction CustomAction からエラー テーブルを使用する方法を教えてもらえますか?

私がやりたいことは、数値が 10,000 より大きいかどうかを確認し、それがエラーをスローするかどうかを確認することです。

    WcaGetIntProperty(L"DIAGNOSTICCHANNELS",&szDiagnosticChannels);
    if (szDiagnosticChannels > 10000) MessageBox(NULL, szError, szTitle, MB_OK|MB_ICONEXCLAMATION);
4

1 に答える 1

1

Windows インストーラーが DoAction からの MsiProcessMessage() をサポートしていないのは非常にイライラします。幸いなことに、WiX ツールセットの wcautil.lib には、レプリケートがそれほど難しくないいくつかのヘルパー メソッドがあります。これは次のようになります。

int nDiagnosticChannels = 0;
PMSIHANDLE hErrorTable;
PMSIHANDLE hErrorMessage;
LPWSTR sczError = NULL;
LPWSTR sczErrorFormatted = NULL;

hr = WcaGetIntProperty(L"DIAGNOSTICCHANNELS",&nDiagnosticChannels);
ExitOnFailure(hr, "Failed to read DIAGNOSTICCHANNELS property.");

if (nDiagnosticChannels > 10000)
{
    // "12345" is your custom error number.
    hr = WcaOpenExecuteView("SELECT `Message` FROM `Error` WHERE `Error`=12345", &hErrorTable); 
    ExitOnFailure(hr, "Failed to query error table.");

    hr = WcaFetchSingleRecord(hErrorTable, hErrorMessage);
    ExitOnFailure(hr, "Failed to get message from error table.");

    hr = WcaGetRecordString(hErrorMessage, 1, &sczError);
    ExitOnFailure(hr, "Failed to get error message");

    hr = WcaGetFormattedString(sczError, &sczErrorFormatted);
    ExitOnFailure(hr, "Failed to format error message");

    ::MessageBox(NULL, sczErrorFormatted, szTitle, MB_OK|MB_ICONEXCLAMATION);
}

LExit:
    ReleaseStr(sczError);
    ReleaseStr(sczErrorFormatted);
    return hr;

いくつかの関数呼び出しを削減するために、さらにいくつかのヘルパー関数があればいいのですが、うまくいきます。

于 2013-03-11T14:00:55.223 に答える