System.IUnknown.QueryInterface
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 との互換性を実現するのが容易になります。