System.IUnknown.QueryInterface

Aus Appmethod Libraries
Wechseln zu: Navigation, Suche

Object Pascal

function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;

Eigenschaften

Typ Sichtbarkeit Quelle Unit Übergeordnet
function public System.pas System IUnknown

Beschreibung

Gibt eine Referenz auf ein bestimmtes Interface zurück, wenn das Objekt dieses Interface unterstützt.

QueryInterface überprüft, ob das Objekt, das dieses Interface implementiert, das in IID angegebene Interface unterstützt. Wenn das Interface unterstützt wird, führt QueryInterface Folgendes aus:

  • Inkrementiert den Referenzzähler.
  • Setzt den Parameter Obj so, dass er auf eine Instanz des angegebenen Interface zeigt.
  • Gibt bei Erfolg 0 zurück.

Wenn das Objekt das Interface nicht unterstützt, gibt QueryInterface einen Fehlercode ungleich Null zurück, wie z. B. E_NoInterface.

Überschreiben von QueryInterface bei Verwendung von BCCIOSARM

Unter Windows übernimmt QueryInterface eine Referenz auf eine GUID/IID. Die Object Pascal-RTL deklariert diesen Parameter als "const", basierend auf der Tatsache, dass der Compiler const-Records, die größer als ein Register sind, durch Übergabe dieser Records per Referenz optimiert. Diese Optimierung ist jedoch nicht unter iOS verfügbar, da sie mit dem hier verwendeten ARM-ABI nicht kompatibel ist. Daher übernimmt unter iOS die Object Pascal-Version von QueryInterface diesen Parameter nicht als Referenz.

Gehen Sie folgendermaßen vor, um C++-Code zu schreiben, der unter Windows und iOS beim Überschreiben von QueryInterface in einer Klasse im Object Pascal-Stil korrekt funktioniert:

  • Sie können für Ihren Code #ifdef, wie im folgenden Beispiel, verwenden:
#if defined(_DELPHI_NEXTGEN) && !defined(_WIN32)
HRESULT __stdcall QueryInterface(const GUID IID, /* out */ void *Obj);
#else
HRESULT __stdcall QueryInterface(const GUID &IID, /* out */ void *Obj);
#endif
  • Sie können einfach die Typdefinition REFIID, wie im folgenden Code, verwenden:
HRESULT __stdcall QueryInterface(REFIID IID, /* out */ void *Obj);
REFIID ist eine Referenz für Desktop-Compiler, aber keine Referenz unter iOS für die Kompatibilität mit Object Pascal.

Siehe auch