コマンド ディスパッチ インターフェイス 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 値 (構造体) の配列に、サポートされているコマンドの一覧と、コマンドの名前や状態情報を記述するテキストを返します。 呼び出し元がコマンドを実行したい場合、コマンド (および設定されたGUID) をオプションと引数と共にExecに渡して、戻り値を取得することができます。