Lohnt es sich, die überprüfung von null-Zeiger in QueryInterface () - Implementierung?
-
07-07-2019 - |
Frage
IUnknown::QueryInterface() wird an einen void** parameter bezeichnet eine Adresse, wo man die Schnittstelle abgerufen.
STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)
Sollte die Implementierung von QueryInterface() überprüfen, dieser Zeiger für die null (und dann sofort wieder E_POINTER) oder schreiben Sie einfach da?
Ich habe gesehen, eine Menge von COM-bezogenen code und fast überall, es wird keine überprüfung durchgeführt.Hypothetisch könnte jemand natürlich übergeben Sie null-Zeiger als dieser parameter, aber ist so überprüfen Sie, wirklich notwendig?
Lösung
Sie (der Anrufer) brauchen nicht um den Zeiger zu überprüfen nicht NULL
zu sein.
Sie sollten jedoch die zurück HRESULT
überprüfen. Das Verfahren kehrt E_POINTER
wenn der Ausgabezeiger ist NULL
und E_NOINTERFACE
, wenn die Schnittstelle nicht unterstützt wird.
sollte der Angerufene den Zeiger prüfen nicht NULL
zu sein und das Rück E_POINTER
wenn es NULL
ist:
MSDN : Rückgabewert:
Diese Methode gibt
S_OK
, wenn die Schnittstelle unterstützt wird, undE_NOINTERFACE
anders. WennppvObject
NULL
ist, gibt diese MethodeE_POINTER
.
Andere Tipps
Nach der MSDN docs, QueryInterface entweder gibt S_OK zurück, in welchem Fall die out-parameter richtig eingestellt werden.Oder es E_NOINTERFACE zurückgegeben, in diesem Fall der parameter nicht eingestellt werden.
Es wird return E_POINTER wenn die void** Sie übergeben den Wert NULL.
Ich würde nicht die Mühe zu überprüfen auf null, sondern ich würde überprüfen Sie den Rückgabewert von IUnknown::QueryInterface
Wahrscheinlich gibt es keinen Schaden bei null, aber angesichts der Garantien der Oberfläche scheint es wie eine redundante überprüfen.
Es hängt davon ab, welche Art von COM-Objekt Sie QI'ing (oder die App präsentiert Ihnen). Die meiste Zeit nur die HRESULT Überprüfung sollte ausreichen. Wenn Sie mit 3rd-Party-Objekten (Explorer Ersatz usw.) handelt, sollten Sie wahrscheinlich auch für NULL überprüfen. Explorer tut dies, und deshalb müssen Sie auch, wenn Sie Abstürze in Buggy-Erweiterungen vermeiden wollen: