2013-03-11 3 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, чтобы вернуть значение свойства и хотите показать ошибку, если она слишком велика. Как планировать настраиваемый тип действия 19 непосредственно перед вашим пользовательским действием, используя условие, основанное на значении свойства DiagnosticChannels (?), Чтобы показать ошибку и выйти? Таким образом, вам не нужно показывать ошибку внутри вашего центра сертификации. –

+0

@StephenConnolly Это отличная идея - это будет работать для некоторых моих пользовательских действий, но у меня есть другие, для которых это не сработает, поскольку я должен проверить, есть ли только буквы и т. Д. Спасибо Также есть способ, которым он мог быть предупреждением? –

+0

Тип 19 - только ошибка. Если вы хотите получить предупреждение, вам нужно написать CA, чтобы справиться с этим. К сожалению, есть проблемы с использованием ProcessMessage() для отображения ящиков сообщений на стороне клиента, например. в волшебнике. –

ответ

1

Очень расстраивает, что установщик Windows не поддерживает MsiProcessMessage() из DoAction. К счастью, wcautil.lib в наборе инструментов WiX имеет некоторые вспомогательные методы, которые затрудняют репликацию. Было бы очень похожи на это:

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

Роб, ты просто всю жизнь прост, спасибо. :) –

Смежные вопросы