IQuickActivate
COM公式ドキュメント
コントロールとコンテナーが、コントロールの読み込み時のパフォーマンスのボトルネックを回避できるようにします。コントロールとそのコンテナーの間で行われる読み込み時または初期化時のハンドシェイクを、単一の呼び出しにまとめます。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
コントロールをクイックアクティブ化します。
| pQaContainer | QACONTAINER* | in | コンテナーに関する情報を格納した QACONTAINER 構造体へのポインター。 |
| pQaControl | QACONTROL* | inout | コントロールがコンテナーへ自身に関する情報を返すために設定する QACONTROL 構造体へのポインター。このメソッドを呼び出すコンテナーは、この構造体のためのメモリを確保しておく必要があります。 |
戻り値
解説(Remarks)
コントロールが IQuickActivate をサポートしていない場合、コンテナーはコントロールを読み込む際に一定のハンドシェイク操作を行います。コンテナーはコントロール上の特定のインターフェイスを呼び出し、コントロールは今度はコンテナーのクライアントサイト上の特定のインターフェイスにコールバックします。まず、コンテナーはコントロールオブジェクトを作成し、QueryInterface を呼び出して必要なインターフェイスを問い合わせます。次に、コンテナーはコントロール上で IOleObject::SetClientSite を呼び出し、自身のクライアントサイトへのポインターを渡します。続いて、コントロールはこのサイト上で QueryInterface を呼び出し、追加で必要なインターフェイスへのポインターを取得します。
QuickActivate メソッドを使用すると、コンテナーは QACONTAINER 構造体へのポインターを渡します。この構造体には、コントロールが必要とするインターフェイスへのポインターと、コントロールが必要とする可能性のあるいくつかのアンビエントプロパティの値が含まれています。戻り時に、コントロールは QACONTROL 構造体へのポインターを渡します。この構造体には、コンテナーが必要とするコントロール自身のインターフェイスへのポインターと、追加の状態情報が含まれています。
IPersist*::Load および IPersist*::InitNew メソッドは、クイックアクティブ化が行われた後に呼び出す必要があります。コントロールは、クイックアクティブ化中にコンテナーのシンクへの接続を確立する必要があります。ただし、これらの接続は IPersist*::Load または IPersist*::InitNew が呼び出されるまで有効になりません。
コントロールのコンテンツ範囲を設定します。
| pSizel | SIZE* | in | コンテンツ範囲のサイズ。 |
戻り値
コントロールのコンテンツ範囲を取得します。
| pSizel | SIZE* | out | コンテンツ範囲のサイズを格納する構造体へのポインター。 |
戻り値
解説(Remarks)
SIZEL 構造体は Wtypes.h で次のように定義されています。
typedef struct tagSIZEL
{
LONG cx;
LONG cy;
} SIZEL;
typedef struct tagSIZEL *PSIZEL;
typedef struct tagSIZEL *LPSIZEL;
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IQuickActivate "{CF51ED10-62FE-11CF-BF86-00A0C9034836}" #usecom global IQuickActivate IID_IQuickActivate "{}" #comfunc global IQuickActivate_QuickActivate 3 var,var #comfunc global IQuickActivate_SetContentExtent 4 var #comfunc global IQuickActivate_GetContentExtent 5 var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IQuickActivate "{CF51ED10-62FE-11CF-BF86-00A0C9034836}" #usecom global IQuickActivate IID_IQuickActivate "{}" #comfunc global IQuickActivate_QuickActivate 3 sptr,sptr #comfunc global IQuickActivate_SetContentExtent 4 sptr #comfunc global IQuickActivate_GetContentExtent 5 sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。