2013-03-11 2 views
1

DoAction CustomAction에서 오류 대화 상자를 사용하려고합니다. MsiProcessMessage을 사용할 수 없다는 것을 알고 있습니다. 지금은 MessageBox을 사용하고 있지만 권장하지 않습니다. 아무도 DoAction CustomAction에서 오류 테이블을 사용하는 방법을 알려 줄 수 있습니까?DoAction 사용자 지정 작업에서 오류 처리

는 내가 뭘 원하는 숫자보다 큰 10,000되어 있는지 확인하고이 오류가 발생하는 경우 :

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

GetProperty를 사용하여 속성 값을 다시 가져 오는 것처럼 보이고 너무 큰 경우 오류를 표시하려고합니다. DiagnosticChannels (?) 속성의 값을 기반으로 조건을 사용하여 오류를 표시하고 종료하는 사용자 지정 작업 직전에 사용자 지정 작업 유형 19를 예약하는 것은 어떻습니까? 그렇게하면 CA 내부에 오류를 표시 할 필요가 없습니다. –

+0

@StephenConnolly 그것은 훌륭한 생각입니다. 그것은 내 사용자 지정 작업의 일부에서 작동하지만 문자가 있는지 등을 확인해야하므로 다른 사람들도 사용할 수 있습니다. 감사합니다. 경고하니? –

+0

유형 19는 오류입니다. 경고를 원한다면이를 처리 할 CA를 작성해야합니다. 불행히도 ProcessMessage()를 사용하여 클라이언트 측에 메시지 상자를 표시하는 데 문제가 있습니다. 마법사에서. –

답변

1

은 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; 

그것은 좋은 것 그러나 그것은 작동합니다.

+0

롭, 방금 내 인생을 단순하게 만들었습니다. 정말 고마워요. :) –

관련 문제