我正在尝试使用DoAction CustomAction中的错误对话框。我知道我不能使用MsiProcessMessage
,目前我正在使用MessageBox
,但我知道不建议这样做。谁能告诉我如何使用DoAction CustomAction中的错误表?
我想要做的是检查一个数字是否大于10,000并且是否抛出错误:
WcaGetIntProperty(L"DIAGNOSTICCHANNELS",&szDiagnosticChannels);
if (szDiagnosticChannels > 10000) MessageBox(NULL, szError, szTitle, MB_OK|MB_ICONEXCLAMATION);
答案 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;
如果有更多辅助函数可以减少一些函数调用,那就太好了,但它会起作用。