은 Windows Installer가 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 (?) 속성의 값을 기반으로 조건을 사용하여 오류를 표시하고 종료하는 사용자 지정 작업 직전에 사용자 지정 작업 유형 19를 예약하는 것은 어떻습니까? 그렇게하면 CA 내부에 오류를 표시 할 필요가 없습니다. –
@StephenConnolly 그것은 훌륭한 생각입니다. 그것은 내 사용자 지정 작업의 일부에서 작동하지만 문자가 있는지 등을 확인해야하므로 다른 사람들도 사용할 수 있습니다. 감사합니다. 경고하니? –
유형 19는 오류입니다. 경고를 원한다면이를 처리 할 CA를 작성해야합니다. 불행히도 ProcessMessage()를 사용하여 클라이언트 측에 메시지 상자를 표시하는 데 문제가 있습니다. 마법사에서. –