문제

COM 인터페이스 메소드는 다양한 반품을 반환 할 수 있습니다 HRESULT 유효하지 않은 인수 값이 전달되는 값. 언제 돌아 오나요? 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* 파일 이름이 "in"매개 변수로 버퍼링됩니다. 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 포인터 유형 매개 변수를 확인할 때?

도움이 되었습니까?

해결책

당신은 돌아옵니다 E_POINTER an의 포인터에 대한 참조 밖으로 매개 변수는 null이므로 프로그램 또는 인터 로프 레이어의 버그를 나타내는 오류 코드로 간주됩니다.

당신은 돌아옵니다 E_INVALIDARG 예를 들어 서로 충돌하는 범위 문제 또는 매개 변수와 같은 매개 변수에 응용 프로그램 수준이있는 경우.

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

그리고 네, 우리 모두는 com을 사랑합니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top