2013-03-11 23 views
1

我想从DoAction CustomAction中使用错误对话框。我知道我不能使用MsiProcessMessage,目前我正在使用MessageBox,但我知道这不被推荐。任何人都可以告诉我如何使用DoAction CustomAction中的错误表?DoAction自定义操作中的错误处理

我想要做的是检查,如果数大于10000,如果是抛出一个错误:

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

看起来你正在做一个GetProperty来取消一个属性的值,并且想要显示一个错误,如果它太大。如何在使用基于DiagnosticChannels(?)属性的值的条件的customaction之前安排自定义动作类型19以显示错误并退出?这样你就不必在你的CA内部显示错误。 – 2013-03-11 12:38:39

+0

@StephenConnolly这是一个好主意 - 这将适用于我的一些自定义操作,但我有其他人,它不会工作,因为我必须检查是否只有字母等。谢谢也有任何方式,它只能是一个警告? – 2013-03-11 12:49:08

+0

类型19只是错误。如果你想要一个警告,你需要编写一个CA来处理它。不幸的是,使用ProcessMessage()在客户端显示消息框有问题,例如在一个向导中。 – 2013-03-12 12:58:50

回答

1

非常令人沮丧的是,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; 

这会是很好,如果有一对夫妇更多的辅助功能也削减了几个函数的调用,但它会奏效。

+0

罗布,你让我的整个人生变得简单,非常感谢你.. :) – 2013-03-11 14:11:03