QueryInterface () 구현에서 Null Pointer를 확인하는 것이 가치가 있습니까?
-
07-07-2019 - |
문제
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는이 작업을 수행하므로 버기 확장에서 충돌을 피하려면 다음을 수행해야합니다.