2014-06-18 3 views
0

COM에 대한 MSDN 개발자 안내서를 읽었습니다. 그러나 this page의 코드는 혼란 스럽습니다.MSDN에서 혼동 COM에서 "오류를 처리하는 데 권장되는 방법"

다음 코드 샘플은 처리 알 수없는 오류의 권장되는 방법을 보여줍니다 : 여기에 재현

HRESULT hr; 
hr = xxMethod(); 

switch (GetScode(hr)) 
{ 
    case NOERROR: 
     // Method returned success. 
     break; 

    case x1: 
     // Handle error x1 here. 
     break; 

    case x2: 
     // Handle error x2 here. 
     break; 

    case E_UNEXPECTED: 
    default: 
     // Handle unexpected errors here. 
     break; 
} 

GetScode 함수를 정의하지 않는 것을,도 NOERROR하고, 검색 MSDN didn 히 도와주세요. 웹 검색은 GetScode이 HRESULT를 SCODE로 변환하는 매크로이지만 32 비트 int이므로 32 비트 int가 무엇인지 모르겠습니다.

32 비트 시스템에서는 아무 것도 수행하지 않는 역사적인 인공물이지만, 16 비트 시스템에서는 hr을 16 비트 int로 변환합니다. 그러나 그것이 사실이라면 0x8000FFFF이기 때문에 E_UNEXPECTED이 어떻게 일치하는지 알지 못합니다. 또한 x1x20x800..... 값인지 또는 일부 잘린 버전인지 여부가 명확하지 않습니다.

마지막으로이 코드는 성공 값의 모두를 오류로 처리합니다. 동일한 MSDN 가이드의 다른 페이지에서는 SUCCEEDED(hr) 또는 FAILED(hr)을 사용하여 성공 또는 실패 여부를 결정해야합니다.

그래서이 코드 샘플 은 실제로 "권장 방법"입니까, 아니면 이런 종류의 문서가 실수입니까?

+0

꽤 오래된 문서 여야합니다. 'GetScode'는 * long *을 사용하지 않는 매크로입니다. 이전에는 권장 된 방법 이었지만 더 이상은 아닙니다. –

답변

0

텍스트가 정확합니다. 하나의 이어야합니다. 특히 코드가 시스템의 다른 곳에서 facility code을 사용하는 경우에는 내부 함수에서 오류 코드를 맹목적으로 반환해야합니다.

특히, COM 인터페이스 기능 수준에서, 당신은 당신이 반환되는 오류 코드는 사용자 인터페이스에 대한 의미가 있는지 확인해야합니다, 당신은 의미있는 오류 코드에 함수 내에서 발생하는 오류를 매핑해야합니다.

그러나 실제적으로 아무도이 작업을 수행하지 않으므로 "예기치 않은 오류"와 같은 기묘하고 실행 불가능한 오류 대화 상자가 표시됩니다.

1

이것은 아주 예쁘다.

//////////////////////////////////// 
//        // 
//  COM Error Codes   // 
//        // 
//////////////////////////////////// 


// 
// The return value of COM functions and methods is an HRESULT. 
// This is not a handle to anything, but is merely a 32-bit value 
// with several fields encoded in the value. The parts of an 
// HRESULT are shown below. 
// 
// Many of the macros and functions below were orginally defined to 
// operate on SCODEs. SCODEs are no longer used. The macros are 
// still present for compatibility and easy porting of Win16 code. 
// Newly written code should use the HRESULT macros and functions. 
// 

나는 꽤 분명 생각하십시오 SDK의 winerror.h 파일은 말한다. 나는 SDK를 먼저 믿고, 그 후에 doc을 믿을 것이다.

우리는 SCODE 일관 WTypesbase.h에 다음과 같이 정의되어 볼 수 있습니다 (이전의 SDK에서, 최근의 SDK에, 나는 그것이 다른 파일에서 생각) :

typedef LONG SCODE; 

그래서 정말 32 비트입니다.