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?

War es hilfreich?

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, und E_NOINTERFACE anders. Wenn ppvObject NULL ist, gibt diese Methode E_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:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top