非常令人沮丧的是,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;
这会是很好,如果有一对夫妇更多的辅助功能也削减了几个函数的调用,但它会奏效。
看起来你正在做一个GetProperty来取消一个属性的值,并且想要显示一个错误,如果它太大。如何在使用基于DiagnosticChannels(?)属性的值的条件的customaction之前安排自定义动作类型19以显示错误并退出?这样你就不必在你的CA内部显示错误。 – 2013-03-11 12:38:39
@StephenConnolly这是一个好主意 - 这将适用于我的一些自定义操作,但我有其他人,它不会工作,因为我必须检查是否只有字母等。谢谢也有任何方式,它只能是一个警告? – 2013-03-11 12:49:08
类型19只是错误。如果你想要一个警告,你需要编写一个CA来处理它。不幸的是,使用ProcessMessage()在客户端显示消息框有问题,例如在一个向导中。 – 2013-03-12 12:58:50