문제

iunkNown :: QueryInterface ()는 검색된 인터페이스를 넣을 주소를 나타내는 void ** 매개 변수가 전달됩니다.

STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)

QueryInterface ()의 구현 이이 포인터가 null인지 확인한 다음 즉시 e_pointer를 반환하거나 그냥 작성해야합니까?

나는 COM 관련 코드를 많이 보았고 거의 모든 곳에서 확인이 수행되지 않습니다. 가설 적으로 누군가는 물론이 매개 변수로 널 포인터를 통과시킬 수 있지만 실제로 검사가 필요합니까?

도움이 되었습니까?

해결책

당신 (발신자)은 포인터를 확인할 필요가 없습니다. NULL.

그러나 반품을 확인해야합니다 HRESULT. 이 방법이 반환됩니다 E_POINTER 출력 포인터 인 경우 NULL 그리고 E_NOINTERFACE 인터페이스가 지원되지 않은 경우


Callee는 포인터가 없는지 확인해야합니다 NULL 그리고 반환 E_POINTER 그렇다면 NULL:

MSDN: 반환 값 :

이 메소드가 반환됩니다 S_OK 인터페이스가 지원되는 경우 E_NOINTERFACE 그렇지 않으면. 만약에 ppvObject ~이다 NULL,이 메소드가 반환됩니다 E_POINTER.

다른 팁

에 따르면 MSDN 문서, QueryInterface 중 하나는 S_OK를 반환하며,이 경우 OUT 매개 변수가 올바르게 설정됩니다. 또는 e_nointerface를 반환 하며이 경우 OUT 매개 변수가 설정되지 않습니다.

당신이 통과하는 void **가 null이면 e_pointer를 반환합니다.

나는 null을 확인하는 것을 귀찮게하지 않을 것입니다.

NULL을 확인하는 데 아무런 해가 없지만 인터페이스의 보장을 감안할 때 중복 점검처럼 보입니다.

그것은 당신이 어떤 종류의 com 객체 (또는 어떤 앱이 당신을 호스팅하는지)에 달려 있습니다. 대부분의 경우 hresult를 확인하는 것만으로는 충분해야합니다. 제 3 자 개체 (Explorer 교체 등)를 다루는 경우 NULL을 확인해야합니다. Explorer는이 작업을 수행하므로 버기 확장에서 충돌을 피하려면 다음을 수행해야합니다.

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