DoAction自定义操作的错误处理

时间:2013-03-11 11:43:00

标签: wix

我正在尝试使用DoAction CustomAction中的错误对话框。我知道我不能使用MsiProcessMessage,目前我正在使用MessageBox,但我知道不建议这样做。谁能告诉我如何使用DoAction CustomAction中的错误表?

我想要做的是检查一个数字是否大于10,000并且是否抛出错误:

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

1 个答案:

答案 0 :(得分:1)

非常令人沮丧的是,Windows Installer不支持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;

如果有更多辅助函数可以减少一些函数调用,那就太好了,但它会起作用。