メッセージ処理とコマンド ターゲット
コマンド ディスパッチ インターフェイス IOleCommandTarget
は、コマンドのクエリと実行を行うための単純で拡張可能なメカニズムを定義します。 このメカニズムは、標準のコマンド セットを全体的に使用しているため、Automation の IDispatch
よりも簡単です。つまり、コマンドに引数はほとんどなく、型情報は含まれていません (タイプ セーフは、コマンド引数についても低下します)。
コマンド ディスパッチ インターフェイスの設計では、各コマンドは、GUID で識別される「コマンド グループ」に属しています。 そのため、誰でも新しいグループを定義し、そのグループ内にすべてのコマンドを定義できます。Microsoft や他のベンダーと連携する必要はありません (これは基本的に、Automation の dispinterface と dispID と同じ定義手段です。ここには重複がありますが、このコマンド ルーティング メカニズムはコマンド ルーティング専用であり、オートメーション ハンドルとしての大規模なスクリプト/プログラミングには使用されません)。
IOleCommandTarget
は、次のシナリオに対応します。
オブジェクトがインプレース アクティブ化されると、通常、オブジェクトのツールバーのみが表示され、[印刷]、[印刷プレビュー]、[保存]、[新規]、[ズーム] など、いくつかのコンテナー コマンド用ボタンがオブジェクトのツールバーに表示される場合があります (インプレース アクティブ化標準では、オブジェクトがツール バーからそのようなボタンを削除するか、少なくとも無効にすることをお勧めします。この設計により、これらのコマンドを有効にして、適切なハンドラーにルーティングすることができます)。現時点では、オブジェクトがこれらのコマンドをコンテナーにディスパッチするメカニズムはありません。
アクティブなドキュメントがアクティブなドキュメント コンテナー (Office Binder など) に組み込まれている場合、コンテナーで [印刷]、[ページ設定]、[プロパティ] などのコマンドを、含まれているアクティブなドキュメントに送信する必要が生じる場合があります。
このシンプルなコマンド ルーティングは、既存の Automation 標準と IDispatch
使用して処理できます。 ただし、IDispatch
に伴うオーバーヘッドは、ここでは必要以上に複雑であるため、より簡単に同じ結果を得られる IOleCommandTarget
を使用できます。
interface IOleCommandTarget : IUnknown
{
HRESULT QueryStatus(
[in] GUID *pguidCmdGroup,
[in] ULONG cCmds,
[in,out][size_is(cCmds)] OLECMD *prgCmds,
[in,out] OLECMDTEXT *pCmdText);
HRESULT Exec(
[in] GUID *pguidCmdGroup,
[in] DWORD nCmdID,
[in] DWORD nCmdExecOpt,
[in] VARIANTARG *pvaIn,
[in,out] VARIANTARG *pvaOut);
}
QueryStatus
メソッドは特定のコマンド セット (GUID で識別されるセット) がサポートされているかどうかをテストします。 この呼び出しによって、サポートされているコマンドのリストで OLECMD 値 (構造体) の配列に入力され、コマンドやステータス情報の名前が示されたテキストが返されます。 呼び出し元がコマンドを呼び出す必要がある場合、オプションや引数と共にコマンドを Exec
に渡し (さらに GUID を設定して)、戻り値を取得できます。