System.IUnknown.QueryInterface

提供: RAD Studio API Documentation
移動先: 案内検索

Delphi

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

プロパティ

種類 可視性 ソース ユニット
function public System.pas System IUnknown

説明

指定されたインターフェイスをオブジェクトがサポートしている場合、そのインターフェイスへの参照を返します。


QueryInterface は、このインターフェイスを実装しているオブジェクトが、IID で指定されたインターフェイスをサポートしているかどうかを確認します。サポートしている場合、QueryInterface は以下を行います。

  • 参照カウントをインクリメントする。
  • 指定されたインターフェイスのインスタンスを Obj パラメータが指すよう設定する。
  • 成功を示す 0 を返す。

オブジェクトがそのインターフェイスをサポートしていない場合、QueryInterface はゼロ以外のエラー コード(E_NoInterface など)を返します。

BCCIOSARM 使用時の QueryInterface のオーバーライド

Windows の場合、QueryInterface は GUID/IID の参照を受け取ります。Delphi RTL では、レジスタのサイズよりも大きい const レコードはコンパイラで最適化されて参照で渡されることを当てにして、このパラメータを const と宣言しています。ただし、この最適化は iOS では行われません。iOS で使われている ARM ABI との互換性がないためです。その結果、iOS の Delphi 版 QueryInterface では、このパラメータを参照で受け取りません。

Windows と iOS の両方で動作する C++ コードを作成するには、QueryInterface を Delphi スタイルのクラスでオーバーライドするときに、以下のいずれかを行ってください。

  • 次のようにコードを #ifdef で囲む。
#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
  • 次のように単に REFIID typedef を使用する。
HRESULT __stdcall QueryInterface(REFIID IID, /* out */ void *Obj);
REFIID は、デスクトップ コンパイラでは参照ですが、iOS では参照ではなく、Delphi との互換性を実現するのが容易になります。

関連項目