System.IUnknown.QueryInterface

De Appmethod Libraries
Aller à : navigation, rechercher

Object Pascal

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

Propriétés

Type Visibilité  Source Unité  Parent
function public System.pas System IUnknown

Description

Renvoie une référence à l'interface spécifiée, si l’objet supporte cette interface.

QueryInterface vérifie si l'objet qui implémente cette interface supporte l'interface spécifiée par IID. Si c'est le cas, QueryInterface :

  • Incrémente le compteur de références.
  • Définit le paramètre Obj afin qu'il pointe sur une instance de l'interface spécifiée.
  • Renvoie 0 pour confirmer la réussite de l'opération.

Si l'objet ne supporte pas l'interface, QueryInterface renvoie un code d'erreur non nul tel que E_NoInterface.

Redéfinition de QueryInterface lors de l'utilisation de BCCIOSARM

Sur Windows, QueryInterface utilise une référence à un GUID/IID. La RTL de Object Pascal déclare ce paramètre en tant que paramètre const, car le compilateur optimise les enregistrements const dont la taille est supérieure à celle d'un registre en les transmettant en tant que référence. Toutefois, cette optimisation n'est pas disponible sur iOS car elle est incompatible avec l'ABI ARM utilisée par ce système d'exploitation. C'est pourquoi, sur iOS, la version Object Pascal de QueryInterface n'utilise pas ce paramètre comme référence.

Pour écrire un code C++ qui fonctionne à la fois sur Windows et iOS, lors de la redéfinition de QueryInterface dans une classe de style Object Pascal, procédez de l'une des manières suivantes :

  • Vous pouvez ajouter une condition #ifdef à votre code, comme dans :
#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
  • Vous pouvez simplement utiliser une instruction typedef REFIID, comme dans :
HRESULT __stdcall QueryInterface(REFIID IID, /* out */ void *Obj);
REFIID est une référence pour les compilateurs de bureau, mais ce n'est pas une référence sur iOS. Elle permet de faciliter la compatibilité avec Object Pascal.

Voir aussi