Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix 来自DoAction自定义操作的错误处理_Wix - Fatal编程技术网

Wix 来自DoAction自定义操作的错误处理

Wix 来自DoAction自定义操作的错误处理,wix,Wix,我试图使用DoAction CustomAction中的错误对话框。我知道我不能使用MsiProcessMessage,目前我正在使用MessageBox,但我知道这是不推荐的。有人能告诉我如何使用DoAction CustomAction中的错误表吗 我想做的是检查一个数字是否大于10000,以及是否抛出错误: WcaGetIntProperty(L"DIAGNOSTICCHANNELS",&szDiagnosticChannels); if (szDiagnostic

我试图使用DoAction CustomAction中的错误对话框。我知道我不能使用
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,您刚刚使我的整个生活变得简单,非常感谢:)