2009-09-15 2 views
8

COM 인터페이스 메서드는 전달 된 잘못된 인수 값을 알리기 위해 다양한 HRESULT 값을 반환 할 수 있습니다. 언제 E_POINTER을 반환하고 언제 E_INVALIDARG을 반환합니까?E_POINTER를 반환 할 때 및 E_INVALIDARG?

메서드가 캡슐화 된 컬렉션의 인덱스를 받고 범위를 벗어난 경우 E_INVALIDARG 인 것으로 알고 있습니다. 메서드가 새로 만들어진 개체에 대한 포인터를 저장할 포인터 인 Interface** 포인터를 받으면 E_POINTER입니다.

HRESULT CImpl::GetItem(long index; Interface** result) 
{ 
    if(result == 0) { 
     return E_POINTER; 
    } 
    if(index < 0 || index >= internalArray.size()) { 
     return E_INVALIDARG; 
    } 
    *result = CreateWrapperObject(internalArray[index]); 
    return S_OK; 
} 

그러나 그것이 매개 변수 "에서"같은 파일 이름으로 WCHAR* 버퍼를 수신하고이 WCHAR*가 null의 경우는? 이 E_POINTER 또는 E_INVALIDARG입니까?

또는 메소드가 일부 구조체에 대한 포인터를 받고 해당 포인터를 통해 구조체를 채울 것으로 예상되며이 포인터가 null 인 경우 - E_POINTER 또는 E_INVALIDARG입니까?

HRESULT CImpl::SaveToFile(WCHAR* fileName) 
{ 
    if(fileName == 0) { 
     return // what to return here? 
    } 
    //... do actual work here 
} 

HRESULT CImpl::GetAttributes(Attributes* to) 
{ 
    if(to == 0) { 
     return // what to return here? 
    } 
    attributes->IsCool = getIsCool(); 
    attributes->Color = RGB(0, 255, 0); 
    return S_OK; 
} 

E_POINTER을 반환 할 때의 규칙과 E_INVALIDARG 체크 포인터 유형 매개 변수는 무엇인가?

답변

9

포인터가 NULL 인 경우이 값은 프로그램 또는 interop 계층의 버그를 나타내는 오류 코드로 간주됩니다.

예를 들어 범위를 벗어난 매개 변수 또는 서로 충돌하는 매개 변수와 함께 응용 프로그램 수준이있는 경우 E_INVALIDARG을 반환합니다. 귀하의 경우에는

이 빈 파일 이름을 전달하는 유효하지 않기 때문에, SaveToFile(...)에 당신은 E_INVLIADARG를 반환해야합니다, 당신은 값을 채울 수 없기 때문에 (그것이 아웃 PARAM 인 경우에) GetAttributes(...)에 당신은 E_POINTER를 반환해야합니다.

예, 우리 모두 L-O-V-E com :

+0

문서 참조가 있으십니까? – Constantin

+0

동의 함. 나는 이것을 위해 MSDN 참조를보고 싶다. 위의 내용은 일종의 의미를 갖지만, 표준적인 파기를 갖는 것이 좋을 것입니다. –

+0

이 답변이 정확한지 잘 모르겠습니다. 예를 들어, VS2010'','AtlSetChildSite()'구현에서'punkChild' 매개 변수가'NULL'이면이 대답에 따라 (정확히 이해했다면)'E_POINTER'가 리턴됩니다.'E_INVALIDARG '그 경우에 반환되었을 것입니다. 난 ATL 좋은 COM 프로그래밍 관행의 좋은 소스, 그래서 아마도'E_POINTER' 잘못된 (예 :'NULL') 포인터의 일반적인 경우에 반환되어야한다고 생각합니다. 그러나 솔직하게 나는 어느 쪽이든 확실하지 않다, 나는 MSDN 공식적인 참고가 좋을 것이라는 점을 동의한다. –

관련 문제