언제 e_pointer를 반환하고 e_invalidarg시기?
-
07-07-2019 - |
문제
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을 사랑합니다 :)