Wix 来自DoAction自定义操作的错误处理
我试图使用DoAction CustomAction中的错误对话框。我知道我不能使用Wix 来自DoAction自定义操作的错误处理,wix,Wix,我试图使用DoAction CustomAction中的错误对话框。我知道我不能使用MsiProcessMessage,目前我正在使用MessageBox,但我知道这是不推荐的。有人能告诉我如何使用DoAction CustomAction中的错误表吗 我想做的是检查一个数字是否大于10000,以及是否抛出错误: WcaGetIntProperty(L"DIAGNOSTICCHANNELS",&szDiagnosticChannels); if (szDiagnostic
MsiProcessMessage
,目前我正在使用MessageBox
,但我知道这是不推荐的。有人能告诉我如何使用DoAction CustomAction中的错误表吗
我想做的是检查一个数字是否大于10000,以及是否抛出错误:
WcaGetIntProperty(L"DIAGNOSTICCHANNELS",&szDiagnosticChannels);
if (szDiagnosticChannels > 10000) MessageBox(NULL, szError, szTitle, MB_OK|MB_ICONEXCLAMATION);
非常令人沮丧的是,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;
如果有更多的帮助函数来减少一些函数调用,那就太好了,但它可以工作。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来恢复属性的值,如果属性太大,则希望显示错误。在customaction之前,使用基于DiagnosticChannel(?)属性值的条件来显示错误并退出,如何安排自定义操作类型19?这样你就不必在你的CA中显示错误了。@Stephennolly这是一个很好的主意-这将对我的一些自定义操作起作用,但我还有其他一些操作不起作用,因为我必须检查是否只有字母等。谢谢。还有什么方法它只能是一个警告?类型19只是错误。如果需要警告,则需要编写CA来处理该警告。不幸的是,使用ProcessMessage()在客户端(例如在向导中)显示消息框时出现问题。看起来您正在执行GetProperty以重新显示属性的值,如果属性太大,则希望显示错误。在customaction之前,使用基于DiagnosticChannel(?)属性值的条件来显示错误并退出,如何安排自定义操作类型19?这样你就不必在你的CA中显示错误了。@Stephennolly这是一个很好的主意-这将对我的一些自定义操作起作用,但我还有其他一些操作不起作用,因为我必须检查是否只有字母等。谢谢。还有什么方法它只能是一个警告?类型19只是错误。如果需要警告,则需要编写CA来处理该警告。不幸的是,使用ProcessMessage()在客户端(例如在向导中)显示消息框时存在问题。Rob,您刚刚使我的整个生活变得简单,非常感谢:)Rob,您刚刚使我的整个生活变得简单,非常感谢:)