1

我正在尝试使用来自 DoAction CustomAction 的错误对话框。我知道我不能使用MsiProcessMessage,目前我正在使用 aMessageBox但我知道不推荐这样做。谁能告诉我如何使用 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 回答