System.IUnknown.QueryInterface

提供: Appmethod Libraries
移動先: 案内検索

Object Pascal

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

C++

virtual HRESULT STDMETHODCALLTYPE QueryInterface(
    /* [in] */ REFIID riid,
    /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) = 0;
QueryInterface(Q** pp)

プロパティ

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

説明

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


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

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

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

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

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

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

  • 次のようにコードを #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 では参照ではなく、Object Pascal との互換性を実現するのが容易になります。

関連項目