メッセージ処理とコマンド ターゲット
更新 : 2007 年 11 月
コマンド ディスパッチ インターフェイス IOleCommandTarget は、コマンドを問い合わせたり実行したりするための簡単で拡張可能な機構を定義します。この機構は、標準的なコマンド セットを基盤にしているため、オートメーションの IDispatch より単純です。ほとんどのコマンドは引数を取らず、型情報もありません。このため、コマンド引数のタイプ セーフ性も低下しています。
このコマンド ディスパッチ インターフェイスでは、各コマンドは GUID で識別される "コマンド グループ" に属しています。したがって、Microsoft やほかの販売元に合わせなくても、だれでも新しいグループやそのグループ内の全コマンドを定義できます。これは、OLE オートメーションの dispinterface と dispID の定義方法と基本的に同じです。このため重複する部分もありますが、このコマンド ルーティング機構はコマンド ルーティングのためだけのものであり、OLE オートメーションで扱うような大規模なスクリプティングやプログラミング向けではありません。
IOleCommandTarget は、以下の場合に使用します。
オブジェクトの埋め込み先編集が有効になっている場合は、通常、オブジェクトのツール バーだけが表示されます。このツール バーには、[印刷]、[印刷プレビュー]、[上書き保存]、[New]、[ズーム] などのコンテナのコマンド ボタンが含まれる場合があります。埋め込み先編集の有効化の標準では、オブジェクト側でこれらのコマンド ボタンを削除するか、少なくとも無効にすることが推奨されています。IOleCommandTarget では、これらのコマンドを有効にし、適切なハンドラにルーティングできます。現時点では、これらのコマンドをオブジェクトからコンテナにディスパッチするための機構はありません。
Active ドキュメントが Office バインダーなどの Active ドキュメント コンテナに埋め込まれていると、場合によっては、[印刷]、[ページ設定]、[プロパティ] などのコマンドをコンテナから埋め込まれている Active ドキュメントに送る必要があります。
この簡単なコマンド ルーティングは、既存のオートメーション標準の 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 に渡し、戻り値を受け取ります。