第 27 章 C++ による VISIO アプリケーションのプログラミング
Visio® が公開するオブジェクトは COM (Component Object Model) に準拠しています。「オブジェクトのインターフェース」、「インターフェースへの参照」という概念は、COM を理解する上で欠かせません。Visio 2000 とともに提供されている C++ ファイル (後の説明を参照) を使用する場合は、ここでの説明を完全に理解していなくてもプログラムを作成できます。しかし、内部的な処理を理解しておくことは決して邪魔にはならないので、通読されることをお勧めします。
オブジェクトのインターフェースおよびインターフェースへの参照を説明するために、擬似コードで表現した簡単な例を示します。
ipAppObj = <Visio のアプリケーション オブジェクトのインターフェースへの参照>
//Documents コレクションの取得
ipDocsObj = ipAppObj->Documents()
//最初の図面の取得
ipDocObj = ipDocsObj->Item(1)
この例に示されるオブジェクト割り当ては、Microsoft Visual Basic でのオブジェクト割り当てとよく似ています。このコード例は、他章で説明されている Microsoft Visual Basic for Applications (VBA) プログラミングについて理解するのにも役立ちます。プログラムは、Document オブジェクトのインターフェースへの参照から、Page オブジェクトへの参照を取得し、この参照から今度は Shape オブジェクトへの参照というように、順にオブジェクトを取得することができます。これらのオブジェクトによって提供されるプロパティおよびメソッドは、前章までで説明されているものと全く同じです。
このコードの実行後のプログラムの状態は、下の図のとおりです。この図では、COM オブジェクトを表現する場合の一般的な表記規則が使われています。制御プログラムは、Visio によって渡された 3 つのオブジェクトのインターフェースの参照を取得しています。矢印は参照、円はインターフェース、Visio インスタンス内のボックスはオブジェクトを表します。
Document オブジェクトを取得した後のプログラムの状態
OLE は種々のインターフェースを提供します。その中には、図面のリンクや埋め込み、永続的なデータ保存をサポートするインターフェースもあります。OLE インターフェース ポインタは、そのインターフェースを持つオブジェクトを表すデータを参照します。オブジェクトのインターフェースは、そのインターフェースで定義されている動作を実行する関数の配列も参照します。オブジェクトのインターフェースへの参照を取得すると、そのインターフェース内で定義されているすべてのメソッドを呼び出すことができます。
Visio が公開しているインターフェースは、デュアル インターフェースです。デュアル インターフェースでは、最初のエントリは、オートメーションの実装に使用する主要なインターフェースである標準 IDispatch インターフェースのエントリと同じです。IDispatch のメソッドの後に、オブジェクトが公開するメソッドおよびプロパティに対応するエントリが続きます。デュアル インターフェースのメソッドおよびプロパティは、IDispatch インターフェースのメソッドを通じて間接的に呼び出すことも、オブジェクトが公開するメソッドおよびプロパティのエントリを通じて直接呼び出すこともできます。
IDispatch インターフェースの関数は、オートメーション コントローラとオートメーション サーバー間のレイト バインディング (実行時に行われるバインディング) を可能にするプロトコルを定義します。しかし、Visio のように、オートメーション サーバーがタイプ ライブラリを提供し、デュアル インターフェースを実装する場合は、アーリー バインディング (コンパイル時に行われるバインディング) が可能です。通常は、それによって実行時にプログラムがメソッドを呼び出す回数が少なくなり、オートメーション コントローラのパフォーマンスが向上します。デュアル インターフェースの詳細については、「Microsoft Platform Software Development Kit (SDK)」のOLE のマニュアルを参照してください。