【発明の詳細な説明】
タイプライブラリーへインターフェイスする方法及びシステム発明の分野
本発明は、一般に、タイプ情報を記憶するためのコンピュータ方法及びシステ
ムに係り、より詳細には、タイプ情報を言語に独立した仕方で記憶する方法及び
システムに係る。先行技術の説明
オブジェクト指向のプログラミング技術を使用すると、複雑なコンピュータプ
ログラムを容易に開発することができる。オブジェクト指向の技術をサポートす
るプログラミング言語が開発されている。1つのこのようなプログラミング言語
がC++である。このC++プログラミング言語は、マイクロソフトコーポレー
ションにより出版された「ザ・C++ランゲッジ・レファレンス」に説明されて
おり、これを参考としてここに取り上げる。
オブジェクト指向のプログラミング言語の2つの一般的な特徴は、データのカ
プセル化及びデータタイプの継承をサポートすることである。データのカプセル
化とは、データを、データに基づいて動作するファンクションヘ結合することを
指す。継承とは、データのタイプを他のデータのタイプの拡張として定義できる
能力を指す。データとファンクションを結合するデータタイプのインスタンスを
「オブジェクト」と称する。
オブジェクトは、ユーザが定義したタイプ(クラスタイプ)に対するランタイ
ム構造体であって、データメンバー及びファンクションメンバーを含むものであ
る。各クラスは、そのデータメンバー及びファンクションメンバーを指定するク
ラス定義を有する。各オブジェクトは、あるクラスタイプであると宣言される。
好ましい実施例においては、オブジェクトのランタイムデータ構造体は、参考と
してここに取り上げる「オブジェクト指向のプログラミング言語のためのコンパ
イラーにおいて仮想ファンクション及び仮想ベースを実現する方法(A Method
for Implementing Virtual Functions and Virtual Bases in a Com
piler for anObject-Oriented Programming Language)」と題する米国特許
出願第07/682,537号に開示されたモデルに一致する。
2つのコンピュータプログラムがオブジェクトの同じインスタンスをアクセス
するのがしばしば有用である。例えば、第1コンピュータプログラムは、共用メ
モリにおいてオブジェクトをインスタンス生成し、オブジェクトの位置を第2の
コンピュータプログラムに知らせる。第2のコンピュータプログラムは、次いで
、共用メモリにおいてオブジェクトをアクセスする。しかしながら、オブジェク
トをアクセスするためには、第2のコンピュータプログラムは、オブジェクトの
クラス定義で書き込まれてコンパイルされる必要がある。第2のコンピュータプ
ログラムは、クラス定義がないと、オブジェクトのデータメンバー及びファンク
ションメンバーをいかにアクセスするか分からない。従って、コンピュータプロ
グラムは、別のコンピュータプログラムと共用しようとする各オブジェクトごと
にクラス定義で書き込まれてコンパイルされる。
あるコンピュータプログラムの開発者が、他のコンピュータプログラムがその
オブジェクトにアクセスするのを許そうとするときには、開発者はそのオブジェ
クトのクラス定義を公表する。他のコンピュータプログラムの開発者は、次いで
その公表されたクラス定義をそれらのコンピュータプログラムに組み込むことが
できる。当業者であれば、この公表は、クラス定義を含む「ヘッダ」ファイルを
使用することが明らかであろう。他のコンピュータプログラムの開発者は、次い
で、そのヘッダファイルに定義されたオブジェクトをアクセスするようにそれら
のコンピュータプログラムを書き込みそしてコンピュータプログラムのソースコ
ードにヘッダファイルを「含ませる」ことができる。次いで、ソースコードがコ
ンパイルされ、オブジェクトをアクセスする準備ができる。
公知の方法では、コンピュータプログラムを開発するときにクラス定義を使用
できることが必要であるから、独立した開発者によって開発されたコンピュータ
プログラム間でのオブジェクトの共用が制限される。この制限された共用は、例
えば、世界中に位置する独立した開発者へ適時にクラス定義を分配することが困
難であるために生じる。同様に、クラス定義に対する更新を分配することも困難
であると共に、開発者がこれらの更新を合体しそしてコンピュータプログラムの
更新したバージョンをユーザヘ分配することも困難である。1つのコンピュータ
プログラムが多数の開発者により与えられるクラス定義を組み込むときにはこれ
らの問題が複合される。又、標準的なプログラミング言語がないために、1つの
プログラミング言語におけるクラス定義を別のものに適応させることは困難であ
る。発明の要旨
本発明の目的は、ユーザが定義したタイプを定める情報を記憶しそしてアクセ
スするためのシステムを提供することである。
本発明の別の目的は、オブジェクトに結合する情報を記憶しそしてアクセスす
るためのシステムを提供することである。
本発明の別の目的は、クラス定義をロードする情報を記憶しそしてアクセスす
るためのシステムを提供することである。
本発明の別の目的は、1つのコンピュータプログラムによりインスタンス生成
されたオブジェクトを、ランタイムにおいて、第2のコンピュータプログラムを
コンパイル時にクラス定義でコンパイルする必要なく第2のコンピュータプログ
ラムによりアクセスできるように、オブジェクトに関連した情報を記憶し、アク
セスし、定義し、結合しそしてロードするためのタイプライブラリーインターフ
ェイス及び具現体を提供することである。
本発明の別の目的は、言語的に独立し、具現的に独立した予めコンパイルされ
たタイプ定義を提供することである。
本発明を以下に説明するときに明らかになるであろうこれら及び他の目的は、
タイプ情報を記憶するタイプライブラリーへインターフェイスする改良されたシ
ステム及び方法によって達成される。好ましい実施例において、本発明は、タイ
プライブラリーへのインターフェイスを定義する。このインターフェイスは、複
数のインターフェイス方法を有し、これら方法により、タイプ情報をタイプライ
ブラリーに記憶しそしてそこから検索することができる。定義されたインターフ
ェイスの複数の具現体が設けられる。コンピュータプログラムは、タイプ情報を
アクセスするように、定義されたインターフェイスを用いてコンパイルされる。
コンパイルされたコンピュータプログラムが実行されるときには、複数の具現体
の1つを用いてタイプ情報をアクセスする。好ましい実施例において、タイプラ
イブラリーは、コンパイラーがコンパイル時にタイプのインスタンスへ結合でき
るようにする(早期結合)タイプ情報を含む。図面の簡単な説明
図1は、タイプライブラリーを使用する例示的なコンピュータプログラム及び
アプリケーションを示すスクリーンレイアウトである。
図2は、タイプライブラリーの発生を示すブロック図である。
図3は、ワードプロセッサがマクロインタープリターを呼び出すときに使用さ
れる例示的要素を示すブロック図である。
図4ないし7は、好ましいタイプライブラリーインターフェイスハイアラーキ
を示すブロック図である。
図5は、ITypeMemberオブジェクトのハイアラーキを示すブロック
図である。
図6は、IFuncDescオブジェクトのハイアラーキを示すブロック図で
ある。
図7は、ITypeDescオブジェクトのハイアラーキを示すブロック図で
ある。
図8は、コードテーブル1のマクロを解読するときにマクロインタープリター
が実行するステップを示す図である。
図9は、ルーチンExecuteGlobalFunctionの流れ線図で
ある。
図10は、ルーチンGetAddressOfGlobalFunction
の流れ線図である。
図11は、ルーチンExecuteFunctionMemberの流れ線図
である。
図12は、ルーチンGetOffsetOfFunctionMemberの
流れ線図である。
図13は、インターフェイスオブジェクトの一般的な構造を示すブロック図で
ある。好ましい実施例の詳細な説明
本発明は、あるコンピュータプログラムが、そのオブジェクト(データメンバ
ー及びファンクションメンバー)を、そのコンピュータプログラムとは独立して
開発された他のコンピュータプログラムにアクセスできるようにする方法及びシ
ステムを提供する。好ましい実施例において、アクセス可能なオブジェクトのタ
イプを定める情報は、「タイプライブラリー」に記憶される。タイプライブラリ
ーは、コンピュータプログラムのアクセス可能なオブジェクトをアプリケーショ
ンに「露呈」する。又、タイプライブラリーは、露呈されたオブジェクトに関す
る結合情報も含む。結合情報は、露呈されたオブジェクトのデータ及びファンク
ションメンバーへ結合するためにコンパイラーやインタープリターのようなアプ
リケーションにより必要とされる情報を含む。結合情報は、インスタンスデータ
内のデータメンバーのオフセットと、仮想ファンクションテーブル内のファンク
ションメンバーに対するポインタのオフセットとを含む。又、タイプライブラリ
ーは、ロード情報も含むのが好ましい。ロード情報は、グローバルなファンクシ
ョン及び変数のアドレスを決定するためにローダのようなアプリケーションによ
り必要とされる情報を含む。又、タイプライブラリーは、ライブラリーにおいて
定義されたタイプを記述するドキュメンテーションを含むのが好ましく、或いは
又、より詳細な情報を含むヘルプファイルに対する参照を含んでもよい。アプリ
ケーションは、タイプライブラリーの情報に基づいてコンピュータプログラムの
オブジェクトをアクセスする。
本発明は、タイプライブラリーに対するインターフェイス(以下に定める)で
あって、これを介してコンピュータプログラムの開発者がタイプ定義を記憶しそ
してこれを介してアプリケーションがタイプ定義を検索するようなインターフェ
イスを提供する。露呈されるべきオブジェクトに対するタイプ定義、結合情報、
及びロード情報は、タイプライブラリーのインターフェイスオブジェクトをイン
スタンス生成しそしてファンクションメンバーを呼び出すことによって記憶され
る。アプリケーションは、タイプライブラリーのインターフェイスオブジェクト
をインスタンス生成しそしてファンクションメンバーを呼び出すことにより、露
呈されたオブジェクトをアクセスする。「アプリケーション」という用語は、コ
ンピュータプログラムオブジェクトに露呈されるコードを指す。このコードは、
コンピュータプログラムと同じプロセスで実行することもできるし、或いはそれ
とは個別のプロセスで実行することもできる。
インターフェイスは、純粋な仮想ファンクションメンバーのみを含む抽象クラ
スであり、即ちこのクラスは、データメンバーも、非仮想ファンクションメンバ
ーも有していない。インターフェイスのファンクションメンバーは、通常は、意
味的に関連している。テーブル12は、クラスISampleのインターフェイ
スを示している。
テーブル12
class ISample
{ public:virtual RETCODE func0()=0;
virtual RETCODE funcl()=0;
virtual RETCODE func2()=0;
}
インターフェイスは、インターフェイスの具現体のインスタンスへのアクセスを
定める具現的に独立したメカニズムを形成し、これはインターフェイスオブジェ
クトと称する。インターフェイスオブジェクトは、インターフェイスのファンク
ションメンバーへのアクセスを与えるデータ構造体である。図13は、インター
フェイスオブジェクトの一般的な構造を示すブロック図である。インターフェイ
スオブジェクトは、インスタンスデータ1301と、仮想ファンクションテーブ
ル1302と、ファンクション1303、1304とを備えている。インスタン
スデータ1301は、仮想ファンクションテーブルのポインタと、インターフェ
イスオブジェクトのファンクションメンバーのみにアクセスできるプライベート
データとを含んでいる。仮想ファンクションテーブル1302は、インターフェ
イスによって定められた各仮想ファンクションのアドレスを含む。ファンクショ
ン1303、1304は、インターフェイスを具現化するコードを含む。
以下の例は、タイプライブラリーの発生と、アプリケーションによるタイプラ
イブラリーの使用とを示す。図1は、タイプライブラリーを使用する例示的なコ
ンピュータプログラム及びアプリケーションを示したスクリーンレイアウトであ
る。コンピュータプログラムは、ウインドウ101を経てユーザと対話するワー
ドプロセッサである。このワードプロセッサは、多数のパラグラフ102を含む
「example.doc」と称する文書をオープンしている。このワードプロ
セッサは、マクロインタープリター(アプリケーション)を呼び出すためのメニ
ュー103を有している。この例において、マクロインタープリターは、呼び出
ししているコンピュータプログラムの同じプロセスの一部分として実行するよう
に構成される。マクロインタープリターは、ユーザからのC++のような言語に
ステートメントを入力し、そしてそのステートメントを解読する。ユーザがマク
ロメニュー103を選択すると、マクロウインドウ104が形成される。ユーザ
は、マクロステートメント105を入力し、そしてマクロウインドウ104のラ
ンメニューを選択して、マクロステートメントを解釈する。この例においては、
マクロステートメント105は、オープンした文書の各パラグラフを正しく位置
合わせさせる。
この例を続けると、ワードプロセッサの開発者は、タイプ定義、結合情報、ロ
ード情報及びドキュメンテーションを含むタイプライブラリーをワードプロセッ
サの実行可能なコードと共に公表する。マクロインタープリターの開発者は、そ
のC++状の言語の記述を公表する。ワードプロセッサ及びマクロインタープリ
ターは、他の特殊な知識なしに開発される。即ち、ワードプロセッサは、予め定
義された名前のファイルに記憶されるマクロインタープリターをロードしそして
ユーザがそのマクロメニューを選択したときにそのマクロインタープリターを呼
び出す必要があることだけを知るように開発される。同様に、マクロインタープ
リターは、その呼び出しているコンピュータプログラムの露呈されたオブジェク
トをアクセスするために呼び出し時にパスしたタイプライブラリーを見る必要が
あることだけを知るように開発される。この同じマクロインタープリターは、ス
プレッドシートやデータベースプログラムのような他の種類のコンピュータプロ
グラムによって呼び出すこともできる。ユーザは、露呈されたワードプロセッサ
オブジェクトのタイプ定義のドキュメンテーションと、マクロインタープリター
の言語の公表された定義とを使用して、ワードプロセッサに対するマクロを開発
する。マクロインターブリターは、これらのマクロを入力し、そしてワードプロ
セッサのタイプライブラリーの情報に基づいてワードプロセッサと対話し、マク
ロを解読する。
図2は、タイプライブラリーの発生を示すブロック図である。タイプライブラ
リーを発生するために、「タイプライブラリー形成」プログラム202は、ダイ
ナミックリンクライブラリー205に含まれたロード情報と共にワードプロセッ
サが露呈するオブジェクトのタイプの定義201を入力し、そしてタイプライブ
ラリーインターフェイス203を用いてタイプライブラリー204を発生する。
ダイナミックリンクライブラリー205は、定義201で定められたコンパイル
されたグローバルなファンクション及びファンクションメンバーを含んでいる。
タイプライブラリー形成プログラム202は、オブジェクトのタイプ定義をタイ
プライブラリーに追加すると共に、ダイナミックリンクライブラリー205から
導出されたロード情報を追加する。次いで、プログラムは、結合情報を発生する
ように定義を「コンパイル」する。
図3は、ワードプロセッサがマクロインタープリターを呼び出すときに使用さ
れる要素を示すブロック図である。ユーザがワードプロセッサ301のマクロメ
ニューを選択するときに、ワードプロセッサは、マクロインタープリターコード
302をワードプロセッサ301のアドレススペースにロードする。別の実施例
において、マクロインタープリター302は、個別のプロセスとしてロードする
ことができ、そして標準的なプロセス間通信メカニズムを用いてワードプロセッ
サ301と通信することができる。マクロインタープリターが呼び出されると、
ユーザは、マクロステートメント303を入力する。マクロインタープリター3
02は、タイプライブラリーのインターフェイスオブジェクト304をインスタ
ンス生成して、ワードプロセッサタイプライブラリー305の情報をアクセスす
る。この例において、ワードプロセッサ301は、タイプ「ドキュメント」クラ
ス及び「パラグラフ」クラスのオブジェクトを露呈する。この例では、ドキュメ
ントオブジェクト310は、インスタンスデータ311及び仮想ファンクション
テーブル312を含む。仮想ファンクションテーブル312は、ドキュメントク
ラスの仮想ファンクションメンバー(例えば、GetPara()313)を具
現化するコードに対するポインタを含む。ファンクションメンバーGetPar
aは、オープンドキュメント内の指定のインデックスのパラグラフに対するポイ
ンタを発呼側へ返送する。インスタンスデータ311は、仮想ファンクションテ
ーブル312のポインタと、ドキュメント内のパラグラフ314のリストのポイ
ンタとを含む。これらパラグラフは、0でスタートするインデックスにより順次
に順序付けされる。パラグラフ314のリストは、パラグラフのテキスト及び特
性(例えば、位置合わせ)を含むパラグラフオブジェクト320、330のポイ
ンタを含む。ワードプロセッサは、ドキュメント内の各パラグラフに対しパラグ
ラフオブジェクトをインスタンス生成する。各パラグラフオブジェクトは、イン
スタンスデータ321及び仮想ファンクションテーブル322を含む。仮想ファ
ンクションテーブル322は、パラグラフクラスの仮想ファンクションメンバー
(例えば、SetJustify()323)を具現化するコードのポインタを
含む。このファンクションメンバーSetJustifyは、パラグラフを指定
の位置合わせにセットする。又、ワードプロセッサは、グローバルなファンクシ
ョンGetDoc340を露呈する。その名前が示すように、ファンクションG
etDocは、現在オープンしているドキュメントに対するドキュメントオブジ
ェクトのポインタを発呼側へ返送する。
コードテーブル1
Macro Justify
1 Document *pdoc
2 Paragraph *ppara
3 pdoc=GetDoc()
4 i=0
5 while(NULL!=(ppara=pdoc->GetPara(i++))
6 ppara->SetJustify(“right”)
EndMacro
コードテーブル1は、オープンドキュメントにおける各パラグラフの位置合わ
せをセットするマクロステートメントをリストする。ステートメントの左側の番
号は参照用である。ライン1において、マクロは、ドキュメントオブジェクトを
指すように変数pdocを宣言する。ライン2において、マクロは、パラグラフ
オブジェクトを指すように変数pparaを宣言する。ライン3において、マク
ロは、オープンドキュメントに対するドキュメントオブジェクトを指すように変
数pdocをセットする。ファンクションGetDocは、ドキュメントオブジ
ェクトに対するポインタを返送する。ライン4において、マクロは変数iを0に
セットする。変数iは、パラグラフを通してインデックスするのに使用される。
ライン5及び6において、マクロは各パラグラフを通してループし、その位置合
わせを正しい位置合わせにセットする。ドキュメントクラスのファンクションメ
ンバーGetParaは、そのパラメータによりインデックスされたパラグラフ
に対するポインタをその値として返送する。パラメータがオープンドキュメント
におけるパラグラフの数より大きい場合には、ファンクション返送値がNULL
にセットされる。パラグラフクラスのファンクションメンバーSetJusti
fyは、パラグラフを正しい位置合わせにセットする。マクロインタープリター
がコードテーブル1のマクロを解読するために実行するステップについて、以下
に述べる。
又、タイプライブラリーは、アプリケーションがタイプライブラリーにおいて
定義されたオブジェクトのインスタンスを形成できるようにするのにも使用され
る。例えば、タイプライブラリーは、指定のタイプのインスタンスを生成してそ
のインスタンス生成されたオブジェクトに対するポインタを返送するファンクシ
ョンCreatelnstanceを与えることができる。次いで、アプリケー
ションは、オブジェクトをアクセスすることができる。上記例のマクロインター
プリターは、オブジェクトであるタイプパラグラフをインスタンス生成し、その
方法を用いてオブジェクトにデータを記憶し、そしてドキュメントオブジェクト
の方法を用いてパラグラフオブジェクトをドキュメントに追加する。
タイプライブラリーインターフェイス
タイプライブラリーインターフェイスは、オブジェクトタイプ情報、結合情報
及びロード情報を定義しそしてアクセスするためのメカニズムを形成する。好ま
しい実施例において、タイプライブラリーインターフェイスは、次のインターフ
ェイスを含む。
ITypeLib
ITypeInfo
ITypeBind
ITypeFixups
ITYpeMembers
IVarInfo
ITypeDesc
IFuncInfo
IFuncDesc
IParamInfo
各タイプライブラリーインターフェイスの具現体は、対応するインターフェイス
オブジェクトを有する。タイプライブラリーインターフェイスはハイアラーキに
おいて定義される。
図4ないし7は、タイプライブラリーのインターフェイスハイアラーキを示す
ブロック図である。当業者であれば、図示されたハイアラーキは、1つの具現化
におけるインターフェイスオブジェクトのデータ構造レイアウトを表しているこ
とが明らかであろう。他のデータ構造レイアウトも使用できる。(図4を参照す
れば、テンプレートインターフェイスオブジェクト401は、図4ないし7に使
用されるインターフェイスオブジェクトレイアウトを表している。各インターフ
ェイスオブジェクトは、インターフェイスのファンクションメンバーのポインタ
を含む仮想ファンクションテーブルを指す仮想ファンクションテーブルポインタ
412と、ブライベートデータメンバー413とを含む。)タイプライブラリー
インターフェイスハイアラーキの基部には、ITypeLibインターフェイス
オブジェクト402がある。各タイプライブラリーは、1つのITypeLib
インターフェイスオブジェクトである。(以下の説明において、「ITypeL
ibインターフェイスオブジェクト」という用語は、「ITypeLibオブジ
ェクト」と省略する。)ITypeLibオブジェクト402は、タイプライブ
ラリーに含まれたオブジェクトタイプ定義に対するポインタ403のリストを指
すポインタを含む。オブジェクトタイプ定義は、0からスタートして順次に順序
付けされる。上記リストにおける各ポインタは、ITypeInfoオブジェク
ト404、405を指す。各ITypeInfoオブジェクトは、1つのオブジ
ェクトタイプの定義、結合及びロード情報を含む。各ITypeInfoオブジ
ェクトは、ItypeMembersオブジェクト406、ITypeBind
オブジェクト407及びITypeFixupsオブジェクト408に対するポ
インタを含む。
図5は、ITypeMembersオブジェクトより低いハイアラーキを示す
ブロック図である。各ITypeMembersオブジェクトは、データメンバ
ー、ファンクションメンバー、及びコンテナオブジェクトタイプのベースメンバ
ーの定義を含む。インターフェイスオブジェクトに対するコンテナオブジェクト
タイプは、インターフェイスオブジェクトが下降してくるところのITypeI
nfoオブジェクトにおいて定義されたオブジェクトタイプを指す。IType
Membersオブジェクト501は、ポインタ510、520及び530の3
つのリストを指すポインタを含む。ポインタ510のリストは、コンテナオブジ
ェクトタイプのファンクションメンバー定義に対するポインタを含む。ポインタ
520のリストは、コンテナオブジェクトタイプのデータメンバー定義に対する
ポインタを含む。ポインタ530のリストは、コンテナオブジェクトタイプのベ
ースクラス定義に対するポインタを含む。1つの実施例において、本発明は多数
の継承をサポートする。ファンクションメンバーの定義、データメンバーの定義
及びベースメンバーの定義各々は、0からスタートして順次に順序付けされる。
ファンクションメンバー定義に対する各ポインタは、IFuncInfoオブジ
ェクト511、512を指す。各IFuncInfoオブジェクトは、コンテナ
オブジェクトタイプの1つのファンクションメンバーの定義を含む。各IFun
clnfoオブジェクトは、ファンクションメンバーの正式なパラメータを定義
するIFuncDescオブジェクト513に対するポインタを含む。データメ
ンバー定義に対する各ポインタは、IVarInfoオブジェクト521、52
2を指す。各IVarInfoオブジェクトは、データメンバー又はベースメン
バーの定義を含む。各IVarInfoオブジェクト521、522は、データ
メンバーのタイプを定義するITypeDesc523のポインタを含む。ベー
スメンバー定義に対する各ポインタは、ベースメンバーのタイプを定義するIT
ypelnfoオブジェクト531、532を指す。
図6は、IFuncDescオブジェクトより下のハイアラーキを示すブロッ
ク図である。IFuncDescオブジェクト601は、ファンクションメンバ
ーの返送タイプを定義するITypeDescオブジェクト602のポインタ、
ファンクションメンバーの正式なパラメータに対するポインタ603のリストを
指すポインタ、及びファンクションメンバーのTHISポインタのタイプを定義
するITypeDescオブジェクト607のポインタを含む。各IParam
Infoオブジェクト604、605は、正式パラメータのタイプを定義するI
TypeDescオブジェクト606を指す。
図7は、ITypeDescオブジェクトより下のハイアラーキを示すブロッ
ク図である。ITypeDescオブジェクトは、オブジェクトタイプの種々の
要素のタイプを定義する(例えば、データメンバー、正式パラメータ、ベースメ
ンバー)。ITypeDescオブジェクト701は、要素のベース(以下に述
べる)のタイプを定義するITypeDescオブジェクト702に対するポイ
ンタ、要素が指すファンクションのタイプを定義するIFuncDescオブジ
ェクト703に対するポインタ、及びユーザが定義したタイプを定めるITYp
eInfoオブジェクト704に対するポインタを任意に含む。
テーブル1ないし11は、タイプライブラリーインターフェイスを定義する。
方法インターフェイスの各々は、以下に詳細に述べる。インターフェイスオブジ
ェクトのデータメンバーは記憶され、そして方法を用いて検索される。データを
検索する方法は、その前に「Get」が付けられ、そしてデータを記憶する方法
は、その前に「Set」が付けられる。例えば、タイプライブラリーの名前は、
方法ITypeLib::SetNameによって記憶され、そして方法ITy
peLib::GetNameにより検索される。これら方法のパラメータは、
パラメータとしてパスした情報を示唆するように名前が付けられタイプ分けされ
る。
テーブル1
classITypeLib {
virtual UNIT GetTypeinfoCount()=0;
virtual SCODE GetTypeInfo(UNIT index,ITypeInfo**Ipipitinfo)=0;
virtual SCODE GetDocumentation(BSTR*IpbstrDoc)=0;
virtual SCODE GetHelpFileName(BSTR*IpbstrFileName)=0;
virtual DWORD GetHelpContext()=0;
virtual SCODE GetTypeBind(ITypeBind**Ipipitbind)=0;
virtual SCODE GetIndex0fName(LPSTRszName,WORD*pwindex)=0;
virtual SCODE GetFunctionId(LPSTRszFunctionName,
BSTR*IpbstrFunctionId=0;
virtual UNIT GetFunctionIdCount()=0;
virtual SCODE GetFunctionId0fIndex(UNIT index,
BSTR*IpbstrFunctionld)=0;
virtual SCODE GetName(BSTR*lpbstrName)=0;
virtual WORD GetLanguageCode()=0;
virtual SCODE GetTypeName(UNIT index BSTR*Ipbstr)=0;
virtual SCODE GetTypeDocumentation(UNIT index BSTR*IPbstrDoc)=0;
virtual SCODE SetDocumentation(LPSTR IpstrDo)=0;
virtual SCODE SetHelpFileName(LPSTR IpstrFileName)=0;
virtual SCODE SetHelpContext(DWORD dwHelpContext)=0;
virtual SCODE SetName(LPSTRszName)=0;
virtual SCODE SetLanguageCode(WORD wLangeCode)=0;
virtual SCODE AddTypeInfo(ITypeInfo*Iptinfo,LPSTRszName)=0;
virtual SCODE RemTypeInfo(UNIT i)=0;
}
ITypeLibインターフェイス
ITypeLibインターフェイスは、ITypeLibオブジェクトの方法
を定義する。アプリケーションは、ファンクションOpenTypeLibra
ryを用いて、指定された名前のタイプライブラリーをオープンし、そのオープ
ンタイプライブラリーに対応するITypeLibオブジェクトをインスタンス
生成し、そしてそのインスタンス生成されたITypeLibオブジェクトに対
するポインタを返送する。ITypeLibオブジェクトの方法は、IType
Infoオブジェクトを追加及び除去し、タイプライブラリーの記述情報(例え
ば、ヘルプファイル、タイプライブラリーの名前)を記憶及び検索し、タイプラ
イブラリー内のITypeInfoオブジェクトを検索し、そしてタイプライブ
ラリーにおいて定義されたファンクション及びデータに対する結合及びロード情
報を検索するという機能を与える。
好ましい実施例においては、タイプライブラリーは、C++状クラス、C++
状列挙子、並びにグローバルなファンクション及びデータを定義する情報を記憶
することができる。
ITypeLib::GetTypeInfoCount
方法GetTypeInfoCountは、このITypeLibオブジェク
トに含まれたITypeInfoオブジェクトの数を検索する。(以下の説明に
おいて、インターフェイスオブジェクトの前の「この(this)」という用語
は、方法が呼び出されるところのインスタンスを指す。)この方法は、上記数を
その値として返送する。この数は、オブジェクトタイプ定義403のリストにお
けるポインタの数に対応する。
ITypeLib::GetTypelnfo
方法GetTypeInfoは、このITypeLibオブジェクトに対して
指定されたインデックスのITypeInfoオブジェクトを検索する。(以下
の説明において、「指定された」という用語は、方法のパラメータを指す。)こ
の方法は、検索されたITypeInfoオブジェクトに対するポインタをパラ
メータとして返送する。
ITypeLib::GetDocumentation
方法GetDocumentationは、このITypeLibオブジェク
トの簡単な記述を含むストリングを検索する。このストリングは、このITyp
eLibオブジェクトの記述を含み、一般に「ブラウザ」によって使用される。
ブラウザとは、タイプライブラリー内のオブジェクトタイプ定義をユーザに表示
するアプリケーションを指す。例えば、上記例のマクロインタープリターは、ワ
ードプロセッサ又はタイプライブラリーを用いてワードプロセッサのオブジェク
トタイプ定義を表示するブラウズモードをもつことができる。この方法は、検索
されたストリングのポインタをパラメータとして返送する。
ITypeLib::GetHelpFileName
方法GetHelpFileNameは、このITypeLibオブジェクト
に対するヘルプファイルのファイル名を含むストリングを検索する。ヘルプファ
イルは、ユーザを助成するのに有用な情報を含む。この方法は、検索されたスト
リングに対するポインタをパラメータとして返送する。
ITypeLib::GetHelpContext
方法GetHelpContextは、このITypeLibオブジェクトに
対しヘルプファイルのコンテクストを検索する。ヘルプコンテクストは、該当情
報のヘルプファイル内の位置を指示する。この方法は、検索されたヘルプコンテ
クストをパラメータとして返送する。
ITypeLib::GetTypeBind
方法GetTypeBindは、このITypeLibオブジェクトに対する
ITypeBindオブジェクトを検索する。この方法は、検索されたITyp
eBindオブジェクトのポインタをパラメータとして返送する。検索されたI
TypeBindオブジェクトは、このITypeLibオブジェクト内の全て
のグローバルなファンクション及びグローバルなデータに対する結合情報をアプ
リケーションが検索できるようにする。検索されたITypeBindオブジェ
クトの機能は、タイプカインド(type kind)のMODULE(以下を参照)を
有するこのITypeLibオブジェクト内の全てのITypeInfoオブジ
ェクトをインスタンス生成することにより与えることができるが、この方法は、
より効率的なメカニズムを具現化できるようにする。
ITypeLib::GetIndexOfName
方法GetIndexOfNameは、このITypeLibオブジェクトに
対し指定された名前のITypeInfoオブジェクトのインデックスを検索す
る。この方法は、検索されたインデックスをパラメータとして返送する。
ITypeLib::GetName
この方法GetNameは、このITypeLibオブジェクトの名前を検索
する。この方法は名前をパラメータとして返送する。名前は、タイプライブラリ
ーと共に定義されたアクセスタイプをサポートするコンパイラーによって使用さ
れるものとする。例えば、ステートメント「WP:Document *pdo
c」は、タイプ−−「WP:Document」−−が「WP」という名前のタ
イプライブラリーにおいてタイプ名「Document」として定義されたこと
をコンパイラーに指示する。
ITypeLib::GetLanguageCode
方法GetLanguageCodeは、このITypeLibオブジェクト
に対する言語識別子を検索する。言語識別子は、このITypeLibオブジェ
クトにおける名前及びオブジェクトの自然言語(例えば、英語、フランス語)を
指示する。この方法は、言語識別子をその値として返送する。
ITypeLib::GetTypeName
方法GetTypeNameは、このITypeLibオブジェクトの指定の
インデックスのITypeInfoオブジェクトの名前を検索する。この方法は
ITypeInfoオブジェクトをロードせずにオブジェクトタイプ名を検索す
るためのメカニズムを与える。この方法は、検索された名前をパラメータとして
返送する。
ITypeLib::GetTypeDocumentation
方法GetTypeDocumentationは、このITypeLibオ
ブジェクトの指定のインデックスのITypeInfoオブジェクトの記述を含
むストリングを検索する。この方法は、ITypeInfoオブジェクトをロー
ドせずにオブジェクトタイプドキュメンテーションを検索するためのメカニズム
を与える。この方法は、検索されたストリングをパラメータとして返送する。
ITypeLib::SetDocumentation
方法SetDocumentationは、指定されたストリングをこのIT
ypeLibオブジェクトに対するドキュメンテーションとして記憶する。
ITypeLib::SetHelpFileName
方法SetHelpFileNameは、指定されたストリングをこのITy
peLibオブジェクトに対するヘルプファイル名として記憶する。
ITypeLib::SetHelpContext
方法SetHelpContextは、指定されたヘルプコンテクストをこの
ITypeLibオブジェクトに対するヘルプコンテクストとして記憶する。
ITypeLib::SetName
方法SetNameは、指定されたストリングをこのITypeLibオブジ
ェクトの名前として記憶する。
ITypeLib::SetLanguageCode
方法SetLanguageCodeは、指定されたコードをこのIType
Libオブジェクトの言語コードとして記憶する。
ITypeLib::AddTypelnfo
方法AddTypeInfoは、指定された名前をもつ指定されたIType
InfoオブジェクトをこのITypeLibオブジェクトに追加する。ITy
pelnfoオブジェクトは、ルーチンCreateTypeInfo(以下に
述べる)と共に形成される。
ITypeLib::RemTypeInfo
方法RemTypeInfoは、このITypeLibオブジェクトから指定
のインデックスのITypeInfoオブジェクトを除去する。
別の実施例において、タイプライブラリーにおいて定義された各グローバルな
ファンクションには独特のファンクション識別子が指定される。ITypeLi
bインターフェイスは、ファンクション識別子を用いてグローバルなファンクシ
ョンに関する情報を検索できるようにする方法を与える。情報は、ファンクショ
ン名を含むストリングを使用するのではなくファンクション識別子を使用するこ
とにより更に効率的に検索することができる。
テーブル2
classITypeInfo{
virtual SCODE GetName(BSTR*lpbstrName)=0;
virtual SCODE GetTypeMembers(ITypeMembers**lplptmembers=0;
virtual SCODE GetTypeBind(ITypeBind**llptbind)=0;
virtual SCODE GetTypeFixups(ITypeFixups**lplptfixups)=0;
virtual TYPEKIND GetTypeKind()=0;
virtual SCODE CreateInstance(VOID**ppobject)=0;
virtual WORD GetLanguageCode()=0;
virtual SCODE GetDocumentation(BSTR*lpbstrDoc)=0;
virtual SCODE GetHelpFileName(BSTR*lpbstrFileName)=0;
virtual DWORD GetHelpContext()=0;
virtual ALIGNKIND GetAlignmentKind()=0;
virtual BOOL IsModifiable()=0;
virtual SCODE SetName(LPSTR lpstrName)=0;
virtual SCODE SetTypeKind(TYPEKIND typekind)=0;
virtual SCODE SetDocumentation(LPSTR lpstrDoc)=0;
virtual SCODE SetHelpContext(DWORD dwHelpContext)=0;
virtual SCODE SetAlignmentKind(ALIGNKIND alignkind)=0;
}
ITypeInfoインターフェイス
ITypeInfoインターフェイスは、ITypeInfoオブジェクトの
方法を定義する。ITypeInfoオブジェクトは、ITypeMember
sオブジェクト、ITypeBindオブジェクト及びITypeFixups
オブジェクトを指す。オブジェクトを指すこれらの各々は、異なるアプリケーシ
ョンが効率的な仕方でアプリケーションにより必要とされる情報をアクセスする
ためのメカニズムを与える。例えば、ブラウザは、ITypeMembersオ
ブジェクトを使用してコンテナオブジェクトタイプの定義をユーザへ表示するこ
とができる。(ブラウザは、タイプライブラリーの情報をユーザに表示するアプ
リケーションである。)コンパイラー又はインタープリターは、ITYpeBi
ndオブジェクトを使用して、データメンバー及びファンクションメンバーのオ
フセットを検索する。ローダは、ITypeFixupsオブジェクトを使用し
て、コンテナオブジェクトタイプのスタティックデータメンバー及びスタティッ
クファンクションメンバーのアドレスを決定する。テーブル2は、ITypeI
nfoインターフェイスをリストする。
各ITypeInfoオブジェクトは指定の「タイプカインド(type kind)
」をを有する。好ましい実施例では、このタイプカインドは、ENUM、REC
O
RD、MODULE、CLASS、ALIAS及びUNIONを含む。ENUM
タイプカインドは、C+十状列挙子である。RECORDタイプカインドは、フ
ァンクションメンバーもベースメンバーも持たないC++状クラスである。MO
DULEタイプカインドは、非クラスファンクション及びデータの集合である。
CLASSタイプカインドは、C+十状クラスである。ALIASタイプカイン
ドは、C+十状タイプ定義である。UNIONタイプカインドは、C++状ユニ
オンである。
ITypelnfo::GetName
方法GetNameは、このITypeInfoオブジェクトによって定義さ
れたオブジェクトタイプの名前を検索する。この方法は、名前をパラメータとし
て返送する。
ITypeInfo::GetTypeMembers
方法gGetTypeMembersは、このITypeInfoオブジェク
トによって定義されたオブジェクトタイプのITypeMembersオブジェ
クトを検索する。このITypeInfoオブジェクトがインスタンス生成され
た後にこの方法が最初に呼び出されたときには、検索されたITypeMemb
ersオブジェクトが初期化され、そのメンバーリストが空となる。この方法は
検索されたITypeMembersオブジェクトのポインタをパラメータとし
て返送する。
ITypeInfo::GetTypeBind
方法GetTypeBindは、このITypeInfoオブジェクトにより
定義されたオブジェクトタイプのITypeBindオブジェクトインスタンス
を検索する。このITypeInfoオブジェクトがインスタンス生成された後
にこの方法が最初に呼び出されたときには、検索されたITypeBindオブ
ジェクトは初期化されない。この方法は、検索されたITypeBindオブジ
ェクトのポインタをパラメータとして返送する。
ITypeInfo::GetTypeFixups
方法GetTypeFixupsは、このITypeInfoオブジェクトに
より定義されたオブジェクトタイプのITypeFixupsオブジェクトを検
索する。このITypeInfoオブジェクトがインスタンス生成された後にこ
の方法が最初に呼び出されたときには、検索されたITypeFixupsオブ
ジェクトは初期化されない。この方法は、検索されたITypeFixupsオ
ブジェクトのポインタをパラメータとして返送する。
ITypeInfo::GetTypeKind
方法GetTypeKindは、このITypeInfoオブジェクトにより
定義されたオブジェクトタイプのタイプカインドを検索する。この方法は、検索
されたタイプカインドをその値として返送する。
ITypeInfo::GetLanguageCode
方法GetLanguageCodeは、このITypeInfoオブジェク
トにより定義されたオブジェクトの言語識別子を検索する。言語識別子は、この
ITypeInfoオブジェクトにおけるテキストの自然言語(例えば、英語や
フランス語)を指示する。この方法は、言語識別子をその値として返送する。
ITypeInfo::CreateInstance
方法CreateInstanceは、このITypeInfoオブジェクト
により定義されたオブジェクトのインスタンスを形成する。この方法は、このI
TypeInfoオブジェクトにより定義されたオブジェクトのタイプカインド
がCLASSでない場合にエラーを返送する。この方法は、インスタンス生成さ
れたオブジェクトのポインタを返送する。
ITypeInfo::GetDocumentation
方法GetDocumentationは、このITypeInfoオブジェ
クトにより定義されたオブジェクトタイプを記述する簡単なドキュメンテーショ
ンを含むストリングを検索する。この方法は、検索されたストリングをパラメー
タとして返送する。
ITypeInfo::GetHelpFileName
方法GetHelpFileNameは、このITypeInfoオブジェク
トにより定義されたオブジェクトタイプに対するヘルプファイルのファイル名を
含むストリングを検索する。この方法は、検索されたストリングをパラメータと
して返送する。
ITypeInfo::GetHelpContext
方法GetHelpContextは、このITypeInfoオブジェクト
により定義されたオブジェクトタイプに対するヘルプファイルのヘルプコンテク
ストを検索する。この方法はヘルプコンテクストをパラメータとして返送する。
ITypeInfo::GetAlignmentKind
方法GetAlignmentKindは、このITypeInfoオブジェ
クトにより定義されたオブジェクトタイプのオブジェクトをインスタンス生成す
るときに使用されるべきアライメント(整列)を検索する。この方法は、アライ
メントをその値として返送する。
ITypeInfo::IsModifiable
方法IsModifiableは、このITypeInfoオブジェクトによ
り定義されたオブジェクトタイプを変更できるかどうかを指示するフラグを検索
する。オブジェクトタイプ定義は、例えば、タイプライブラリーのユーザが定義
を変更するのを防止するために、変更可能にされない。この方法は、フラグをそ
の値として返送する。
ITypeInfo::SetName
方法SetNameは、指定された名前を、このITypeInfoオブジェ
クトにより定義されたオブジェクトタイプの名前として記憶する。
ITypeInfo::SetTypeKind
方法SetTypeKindは、指定されたタイプカインドを、このITyp
eInfoオブジェクトにより定義されたオブジェクトタイプのタイプカインド
として記憶する。
ITypeInfo::SetDocumentation
方法SetDocumentationは、指定されたストリングを、このI
TypeInfoオブジェクトにより定義されたオブジェクトタイプのドキュメ
ンテーションとして記憶する。
ITypeInfo::SetHelpContext
方法SetHelpContextは、指定されたヘルプコンテクストを、こ
のITypeInfoオブジェクトにより定義されたオブジェクトタイプのヘル
プコンテクストとして記憶する。
ITypeInfo::SetAlignmentKind
方法SetAlignmentKindは、指定されたアライメント(整列)
を、このITypeInfoオブジェクトにより定義されたオブジェクトタイプ
のオブジェクトに対するアライメントとして記憶する。
テーブル3
class ITypeMembers{
virtual SCODE GetTypeInfoContainer(ITypeInfo**lplptinfoContainer)=0;
virtual UNIT GetFuncCount()=0;
virtual SCODE GetFunc(UNITindex,IFuncInfo**lplpfinfoFunc)=0;
virtual UNIT GetVarCount()=0;
virtual SCODE GetVar(UNITindex,IVarInfo**lplpvinfoVar)=0;
virtual SCODE GetBase(ITypeInfo**lplptinfoBase)=0;
virtual VARTYPE GetVarTypeEnumimpl()=0;
virtual BOOL IsLaid0ut()=0;
virtual SCODE GetTypeDescPvft(ITYpeDesc**lplpdesc)=0;
virtual SCODE GetTypeDescAlias(ITYpeDesc**lplptdesc)=0;
virtual SCODE GetMemberInfo0fHmember(HMEMBER hmember,
IMemberInfo**lplpminfo=0;
virtual SCODE AddFunc(UNIT index,IFuncInfo*lpfinfoFunc)=0;
virtual SCODE RemFunc(UNIT index)=0;
virtual SCODE AddVar(UNIT index,IVarInfo*lpvinfoVar)=0;
virtual SCODE RemVar(UNIT index)=0;
virtual SCODE SetBase(ITypeInfo*lptinfoBase)=0;
virtual SCODE MakeLaidOut()=0;
virtual SCODE SetVarTypeEnumimpl(VARTYPEvt)=0;
virtual SCODE SetTypeDescPvft(ITypeDesc*lptdescPvft)=0;
virtual SCODE SetTypeDescAlias(ITypeDesc*lptdescAlias)=0;
}
ITypemembersインターフェィス
ITypeMembersインターフエイスは、ITypeMembersオ
ブジェクトの方法を定義する。上記のように、ITypeMembersオブジ
ェクトは、コンテナオブジェクトタイプのベースメンバー、データメンバー及び
ファンクションメンバーを定義する。ベースメンバーのタイプを繰り返し処理す
ることによりオブジェクトタイプの完全なハイアラーキを形成できる。テーブル
3は、ITypeMembersインターフェイスをリストする。ITypeM
embersインターフェイスは、そのコンテナオブジェクトタイプ内のメンバ
ーを識別するのに使用されるメンバーハンドルを定義する。このメンバーハンド
ルは、メンバー名を含むストリングを使用するよりも、メンバーを識別するより
効率的な方法を与える。
ITypemembers::GetTypeInfoContainer
方法GetTypeInfoContainerは、このITypeMemb
ersオブジェクトを含むITypeInfoオブジェクトを検索する。この方
法は、検索されたITypeInfoオブジェクトのポインタをパラメータとし
て返送する。ITypeMembersオブジェクトが形成されるときには、そ
のインスタンスデータは、コンテナITypeInfoオブジェクトの指示を含
む。この方法は、タイプの属性(例えば、そのITypeBindインターフェ
イス)を検索するのに使用できる。
ITypemembers::GetFuncCount
方法GetFuncCountは、このITypeMembersオブジェク
トにより定義されたコンテナオブジェクトタイプについて定めたファンクション
メンバーの数を検索する。この方法は検索された数をその値として返送する。
ITypemembers::GetFunc
方法GetFuncは、このITypeMembersオブジェクトにより定
義されたコンテナオブジェクトタイプの指定のインデックスでファンクションメ
ンバーを定めるIFuncInfoオブジェクトを検索する。この方法は検索さ
れたIFuncInfoオブジェクトのポインタをパラメータとして返送する。
ITypemembers::GetVarCount
方法GetVarCountは、このITypeMembersオブジェクト
により定義されたコンテナオブジェクトタイプについて定められたデータメンバ
ーの数を検索する。この方法は、上記数をその値として返送する。
ITypemembers::GetVar
方法GetVarは、このITypeMembersオブジェクトにより定義
されたコンテナオブジェクトタイプの指定のインデックスでデータメンバーを定
めるIVarInfoオブジェクトを検索する。この方法は、検索されたIVa
rlnfoオブジェクトのポインタをパラメータとして返送する。
ITypemembers::GetBase
方法GetBaseは、ベースメンバーを定めるITypeInfoオブジェ
クトがもしあれば、そのポインタを検索する。この方法は、ITypeInfo
オブジェクトに対するポインタをパラメータとして返送する。
ITypemembers::GetVarTypeEnumImpl
方法GetVarTypeEnumImplは、このITypeMember
sオブジェクトにより定義された列挙子の一体的タイプを検索する。このITy
peMembersオブジェクトにより定義されたコンテナオブジェクトタイプ
がENUMタイプカインドでない場合には、この方法はエラーを返送し、さもな
くば、この方法は一体的タイプをその値として返送する。
ITypemembers::IsLaidOut
方法IsLaidOutは、このITypeMembersオブジェクトによ
り定義されたコンテナオブジェクトタイプが首尾良くコンパイルされたかどうか
示すフラグを検索する。コンパイルプロセスは結合情報を発生し、アプリケーシ
ョンが結合情報を用いてコンテナオブジェクトタイプのオブジェクトをアクセス
できるようにする。この方法は、検索されたフラグをその値として返送する。
ITypemembers::GetTypeDescPvft
方法GetTypeDescPvftは、このITypeMembersオブ
ジェクトにより定義されたコンテナオブジェクトタイプで定められたコンテナオ
ブジェクトタイプの仮想ファンクションテーブルポインタのタイプ(例えば、一
定、近、遠、等)を定義するITypeDescオブジェクトを検索する。コン
テナオブジェクトタイプが一次仮想ファンクションテーブルポインタを有してい
ない場合には、この方法はポインタをNULLにセットする。この方法は、検索
されたポインタをパラメータとして返送する。
ITypemembers::GetTypeDescAlias
方法GetTypeDescAliasは、このITypeMembersオ
ブジェクトにより定義されたコンテナオブジェクトタイプがエイリアスであると
ころのタイプを定義するITypeDescオブジェクトを検索する。コンテナ
オブジェクトタイプがALIASタイプカインドでない場合には、この方法は、
ポインタをNULLにセットする。この方法は、検索されたITypeDesc
オブジェクトに対するポインタをパラメータとして返送する。
ITypemembers::GetMemberInfoOfHmembe r
方法GetMemberInfoOfHmemberは、このITypeMe
mbersオブジェクトにより定義されたコンテナオブジェクトタイプに対する
指定のメンバーハンドルでメンバーを定義するIMemberInfoオブジェ
クトを検索する。この方法は、検索されたIMemberInfoオブジェクト
に対するポインタをパラメータとして返送する。
ITypemembers::AddFunc
方法AddFuncは、このITypeMembersオブジェクトにより定
義されたコンテナオブジェクトのファンクションメンバーのリストにおける指定
のインデックスの前にファンクションメンバーを定義する指定のIFuncIn
foオブジェクトのコピーを追加する。コンテナオブジェクトタイプに現在定義
されているファンクションメンバーの数に等しいインデックスを指定することに
より新たなファンクションを添付することができる。
ITypemembers::RemFunc
方法RemFuncは、このITypeMembersオブジェクトにより定
義されたコンテナオブジェクトタイプのファンクションメンバーのリストから、
指定のインデックスをもつIFuncInfoオブジェクトを除去する。この除
去後に、指定のインデックスより大きなファンクションメンバーのインデックス
が減少される。
ITypemembers::AddVar
方法AddVarは、このITypeMembersオブジェクトにより定義
されたコンテナオブジェクトタイプのデータメンバーのリストにおいて指定のイ
ンデックスの前にデータメンバーを定義する指定のIVarInfoオブジェク
トのコピーを追加する。コンテナオブジェクトタイプに現在定義されているデー
タメンバーの数に等しいインデックスを指定することにより新たなデータメンバ
ーが添付されてもよい。
ITypemembers::RemVar
方法RemVarは、このITypeMembersオブジェクトにより定義
されたコンテナオブジェクトタイプのデータメンバーのリストから、指定のイン
デックスをもつIVarInfoオブジェクトを除去する。その除去後に、指定
のインデックスより大きいデータメンバーのインデックスが減少される。
ITypemembers::SetBase
方法SetBaseは、ベースクラスを指定のITypeInfoにセットす
る。
ITypemembers::MakeLaidOut
方法MakeLaidOutは、このITypeMembersオブジェクト
により定義されたコンテナオブジェクトタイプをコンパイルする。
ITypemembers::SetVarTypeEnumImpl
方法SetVarTypeEnumImplは、このITypeMember
sオブジェクトにより定義されたコンテナオブジェクトタイプの列挙子の一体的
タイプを記憶する。
ITypemembers::SetTypeDescPvft
方法SetTypeDescPvftは、このITypeMembersオブ
ジェクトにより定義されたコンテナオブジェクトタイプの仮想ファンクションテ
ーブルポインタのタイプを記憶する。
ITypemembers::SetTypeDescAlias
方法SetTypeDescAliasは、このITypeMembersオ
ブジェクトにより定義されたコンテナオブジェクトタイプがエイリアスであると
ころのオブジェクトタイプを記憶する。
テーブル4
class IMemberInfo {
virtual SCODE GetName(BSTR*lpbstrName)=0;
virtual HMEMBER GetHMember()=0;
virtual SCODE GetDllEntry(BSTR*lpbstrFile,DWORD*lpdwDllOrdinal)=0;
virtual SCODE GetDocumentation(BSTR*lpbstrDoc)=0;
virtual DWORD GetHelpContext()=0;
virtual SCODE GetTypeInfoContainer(ITypeInfo**lplptinfo)=0;
virtual SCODE SetName(LPSTR szName)=0;
virtual SCODE SetHmember(HMEMBER hmemberVar)=0;
virtual SCODE SetDllEntry(LPSTR szFile,DWORD dwDllOrdinal)=0;
virtual SCODE SetDocumentation(LPSTR szDoc)=0;
virtual SCODE SetHelpContext(DWORD dwHelpContext)=0;
};
IMemberInfoインターフェイス
IMemberInfoインターフェイスは、IMemberInfoオブジ
ェクトの方法を定義する。IMemberInfoインターフェイスは、IVa
rInfo及びIFuncInfoインターフェイスに対するベースクラスとし
て働く。IMemberInfoインターフェイスは、データメンバー、ベース
メンバー及びファンクションメンバーに共通する特徴を定義する。テーブル4は
IMemberInfoインターフェイスのリストである。
IMemberInfo::GetName
方法GetNameは、このIVarInfo又はIFuncInfoオブジ
ェクトにより定義されたコンテナオブジェクトタイプのメンバーの名前を検索す
る。この方法は、検索された名前をパラメータとして返送する。
IMemberInfo::GetHMember
方法GetHMemberは、このIVarInfo又はIFuncInfo
オブジェクトにより定義されたコンテナオブジェクトタイプのメンバーに対する
メンバーハンドルを形成する。
IMemberInfo::GetDllEntry
方法GetDllEntryは、メンバーがDLLエントリーを有するときに
このIVarInfo又はIFuncInfoオブジェクトによって定義された
コンテナオブジェクトタイプのメンバーに対しダイナミックリンクライブラリー
(DLL)の名前及びDLLにおける順序を検索する。スタティックデータメン
バー及びスタティックファンクションメンバーは、DLLエントリーを有する。
メンバーがDLLにおいて対応するエントリーを有していない場合に、この方法
は、DLLファイル名を空のストリングにセットする。この方法は、検索された
DLLファイル名及び順序をパラメータとして返送する。
IMemberInfo::GetDocumentation
方法GetDocumentationは、このIVarInfo又はIFu
ncInfoオブジェクトによって定義されたコンテナオブジェクトタイプのメ
ンバーの記述を含むストリングを検索する。この方法は、検索されたストリング
をパラメータとして返送する。
IMemberInfo::GetHelpContext
方法GetHelpContextは、このIVarInfo又はIFunc
Infoオブジェクトにより定義されたコンテナオブジェクトタイプのメンバー
に対するヘルプコンテクストを検索する。ヘルプコンテクストは、コンテナIT
ypeInfoオブジェクトのヘルプファイルに対するインデックスである。ヘ
ルプコンテクストは、メンバーの詳細な記述をアクセスするのに使用される。こ
の方法は、検索されたヘルプコンテクストをパラメータとして返送する。
IMemberInfo::GetTypeInfoContainer
方法GetTypeInfoContainerは、このIVarInfo又
はIFuncInfoオブジェクトを含むITypeInfoオブジェクトを検
索する。この方法は、検索されたITypeInfoオブジェクトをパラメータ
として返送する。
IMemberInfo::SetName
方法SetNameは、指定された名前を、このIVarInfo又はIFu
ncInfoオブジェクトにより定義されたコンテナオブジェクトタイプのメン
バーの名前として記憶する。
IMemberInfo::SetHmember
方法SetHmemberは、指定されたメンバーハンドルを、このIVar
Info又はIFuncInfoオブジェクトにより定義されたコンテナオブジ
ェクトタイプのメンバーのメンバーハンドルとして記憶する。
IMemberInfo::SetDllEntry
方法SetDllEntryは、指定のファイル名及び指定された順序をこの
IVarInfo又はIFuncInfoオブジェクトにより定義されたコンテ
ナオブジェクトタイプのメンバーに対するファイル名及び順序として記憶する。
IMemberInfo::SetDocumentation
方法SetDocumentationは、指定されたストリングを、このI
VarInfo又はIFuncInfoオブジェクトにより定義されたコンテナ
オブジェクトタイプのメンバーに対するドキュメンテーションとして記憶する。
IMemberInfo::SetHelpContext
方法SetHelpContextは、このIVarInfo又はIFunc
Infoオブジェクトにより定義されたコンテナオブジェクトタイプのメンバー
に対するヘルプコンテクストを記憶する。
テーブル5
Class IVarInfo:Public IMemberInfo{
virtual VARKIND GetVarKind()=0;
virtual SCODE GetTypeDesc(ITypeDesc**lplptdesc)=0;
virtual SCODE GetVal(VARIANT*lpvariant)=0;
virtual BOOL IsStatic()=0;
virtual BOOL GetOVar(LONG*lpvbpVar)=0;
virtual SCODE SetTypeDesc(ITypeDesc*lptdesc)=0;
virtual SCODE SetVal(VARIANT variant)=0;
virtual SCODE SetStatic(BOOL fStatic)=0;
};
IVarInfoインターフェイス
IVarInfoインターフェイスは、IVarInfoオブジェクトの方法
を定義する。IVarInfoインターフェイスは、IMemberInfoイ
ンターフェイスを継承し、そしてデータメンバー、ベースメンバー及び列挙子を
定義するメカニズムを与える。「変数カインド(variable kind)」という語は
、IVarInfoオブジェクトがベースメンバーを定義するか、データメンバ
ーを定義するか又は列挙子を定義するかを指示する。「変数」という語は、デー
タメンバー、ベースメンバー又は列挙子を指す。テーブル5は、IVarInf
oインターフェイスによって導入される方法をリストしたものである。
IVarInfo::GetVarKind
方法GetVarKindは、このIVarInfoオブジェクトが定義する
変数カインドを検索する。
IVarInfo::GetTypeDesc
方法GetTypeDescは、このIVarInfoオブジェクトにより定
義された変数のオブジェクトタイプを定義するITypeDescオブジェクト
を検索する。この方法は、検索されたITypeDescに対するポインタをパ
ラメータとして返送する。
IVarInfo::GetVal
方法GetValは、このIVarInfoオブジェクトにより定義された変
数が一定のデータメンバー又は列挙子であるときに変数タイプを検索する。この
方法は、ポインタを引数として返送する。この方法は、変数が一定のデータメン
バー又は列挙子でない場合にエラーを返送する。
IVarInfo::IsStatic
方法IsStaticは、このIVarInfoオブジェクトにより定義され
た変数がスタティックであるかどうかを指示するフラグを検索する。この方法は
検索されたフラグをその値として返送する。コンテナオブジェクトタイプのタイ
プカインドがMODULEである場合には、データメンバーが常にスタティック
であるのが好ましい。
IVarInfo::GetOVar
方法GetOVarは、このIVarInfoオブジェクトにより定義された
変数に対しコンテナオブジェクトタイプのオブジェクトのインスタンスデータの
開始からオフセットを検索する。このオフセットは、ベースメンバー及び非一定
のデータメンバーにのみ適用できる。この方法は、オフセットをパラメータとし
て返送する。
IVarInfo::SetTypeDesc
方法SetTypeDescは、このIVarInfoオブジェクトにより定
義された変数のタイプを記憶する。
IVarInfo::SetVal
方法SetValは、指定された変数を、このIVarInfoオブジェクト
により定義された変数に対する一定値として記憶する。
IVarInfo::SetStatic
方法SetStaticは、指定されたフラグを、このIVarInfoオブ
ジェクトにより定義された変数に対するスタティックフラグとして記憶する。
テーブル6
class ITypeDesc {
virtual VARTYPE GetVarType()=0;
virtual SCODE GetTypeDescBasis(ITypeDesc**lplptdesc)=0;
virtual BOOL IsConst()=0;
virtual BOOL IsVolatile()=0;
virtual DWORD GetSize()=0;
virtual SCODE GetFuncDesc(IFuncDesc**lplpfdesc)=0;
virtual SCODE GetTypeInfo(ITypeInfo**lplptinfo)=0;
virtual SCODE SetVarType(VARTYPE vt)=0;
virtual SCODE SetTypeDescBasis(ITypeDesc*lptdesc)=0;
virtual SCODE SetConst(BOOL fConst)=0;
virtual SCODE SetVolatile(BOOL fVolatile)=0;
virtual SCODE SetSize(DWORD cbSizeType)=0;
virtual SCODE SetFuncDesc(IFuncDesc*lpfdesc)=0;
};
ITypeDescインターフェイス
ITypeDescインターフェイスは、ITypeDescオブジェクトの
方法を定義する。ITypeDescオブジェクトは変数のタイプを定義する。
好ましい実施例において、ITypeDescオブジェクトは、基本的なタイプ
(例えば、一体的タイプ、浮動タイプ)及び導出されたタイプを定義する。テー
ブル6は、ITypeDescインターフェイスをリストするものである。導出
されたタイプは、直接導出されたタイプ(例えば、変数又はオブジェクトのアレ
ー、ファンクション、変数又はオブジェクトのポインタ、オブジェクトに対する
参照、定数、クラスメンバーに対するポインタ)、及び構成され導出されたタイ
プ(例えば、クラス、構造、ユニオン)を含む。
ITypeDesc::GetVarType
方法GetVarTypeは、このITypeDescオブジェクトの変数タ
イプを検索する。この方法は、検索された変数タイプをその値として返送する。
変数タイプは、この変数が特定の基本的タイプであるか、直接導出されたタイプ
であるか、又は構成された導出タイプであるかを指示する。
ITypeDesc::GetTypeDescBasis
方法GetTypeDescBasisは、このITypeDescオブジェ
クトにより定義された変数の導出されたタイプを定めるITypeDescオブ
ジェクトを検索する。この方法は、検索されたITypeDescのポインタを
パラメータとして返送する。
ITypeDesc::IsConst
方法IsConstは、このITypeDescオブジェクトにより定義され
た変数が定数であるかどうかを指示するフラグを検索する。この方法は、検索さ
れたフラグをその値として返送する。
ITypeDesc::IsVolatile
方法IsVolatileは、このITypeDescオブジェクトにより定
義された変数が揮発性であるかどうかを指示するフラグを検索する。この方法は
検索されたフラグをその値として返送する。
ITypeDesc::GetSize
方法GetSizeは、このITypeDescオブジェクトにより定義され
た変数のサイズを検索する。この方法は、検索したサイズをその値として返送す
る。
ITypeDesc::GetFuncDesc
方法GetFuncDescは、このITypeDescオブジェクトにより
定義された変数が指すファンクションの原型を定義するIFuncDescオブ
ジェクトを検索する。この方法は、検索されたIFuncDescのポインタを
パラメータとして返送する。この変数がファンクションのポインタでない場合に
は、この方法はポインタをNULLにセットする。
ITypeDesc::GetTypeInfo
方法GetTypeInfoは、このITypeDescオブジェクトにより
定義された変数のオブジェクトタイプを定義するITypeInfoオブジェク
トを検索する。この方法は、検索されたITypeDescオブジェクトに対す
るポインタを返送する。該当しない場合には、この方法はこのポインタをNUL
Lにセットする。
ITypeDesc::SetVarType
方法SetVarTypeは、このITypeDescオブジェクトにより定
義された変数の変数タイプを記憶する。
ITypeDesc::SetTypeDescBasis
方法SetTypeDescBasisは、このITypeDescオブジェ
クトにより定義された変数の導出タイプを記述するために指定のITypeDe
scオブジェクトを記憶する。
ITypeDesc::SetConst
方法SetConstは、このITypeDescオブジェクトに対して定義
された変数の定数フラグとして指定のフラグを記憶する。
ITypeDesc::SetVolatile
方法SetVolatileは、このITypeDescオブジェクトに対し
て定義された変数の揮発性フラグとして指定のフラグを記憶する。
ITypeDesc::SetSize
方法SetSizeは、このITypeDescオブジェクトにより定義され
た変数のサイズとして指定のサイズを記憶する。サイズは、固定長さのストリン
グに対してのみ設定できる。サイズは他の全ての変数タイプから推定できる。
ITypeDesc::SetFuncDesc
方法SetFuncDescは、このITypeDescオブジェクトにより
定義された変数が指すファンクションの原型を定義するために指定のIFunc
Descを記憶する。
テーブル7
class IFuncInfo:Public IMemberInfo {
virtual SCODE GetFuncDesc(IFuncDesc**lplpfdesc)=0;
virtual BOOL IsProperty()=0;
virtual BOOL IsPure()=0;
virtual UNIT GetOvft()=0;
virtual FUNCKIND GetFuncKind()=0;
virtual SCODE SetFuncDesc(IFuncDesc*lpfdesc)=0;
virtual SCODE SetProperty(BOOL fProperty)=0;
virtual SCODE SetPure(BOOL fPure)=0;
virtual SCODE SetFuncKind(FUNCKIND fkindFunc)=0;
};
IFuncInfoインターフェイス
IFuncInfoインターフェイスは、IFuncInfoオブジェクトの
方法を定義する。IFuncInfoインターフェイスは、IMemberIn
foインターフェイスを継承し、ファンクションの原型及びファンクションの結
合情報を定義する。テーブル7は、IFunctionInfoの原型をリスト
したものである。
IFuncInfo::GetFuncDesc
方法GetFuncDescは、このIFuncInfoオブジェクトによっ
て定義されたファンクションの原型情報を定めるIFuncDescオブジェク
トのポインタを検索する。この方法は、検索されたIFuncDescのポイン
タをパラメータとして返送する。
IFuncInfo::GetPropKind
方法GetPropKindは、このIFuncInfoオブジェクトにより
定義されたファンクションに対する特性カインドを検索する。この特性カインド
は、このIFuncInfoが特性関数であるかどうか指示し、もしそうであれ
ば、特性関数のタイプを指示する。特性関数とは、データメンバーがアクセスさ
れるのと同じ方法で言語において構文的に呼び出されたファンクションである。
コンパイラーは、ファンクションメンバーの呼び出しへのデータメンバーアクセ
スであると考えられるものをコンパイルする。特性関数は、特性がセットされた
ときに動作を行えるようにする。例えば、パラグラフが位置合わせ特性を有する
場合に、位置合わせ特性が正しいとセットされたときに、データメンバーセット
だけではなく、方法も呼び出されて、もし表示されればパラグラフを更新する。
特性ファンクションのタイプは、セットであるかゲットである。この方法は、特
性カインドをその値として返送する。
IFuncInfo::IsPure
方法IsPureは、このIFuncInfoオブジェクトにより定義された
ファンクションが純粋な仮想ファンクションであるかどうかを指示するフラグを
検索する。この方法は、検索されたフラグをその値として返送する。
IFuncInfo::GetOvft
方法GetOvftは、このIFuncInfoオブジェクトにより定義され
たファンクションのコンテナオブジェクトタイプの仮想ファンクションテーブル
におけるオフセットを検索する。このファンクションが仮想ファンクションでな
い場合には、指示子が返送される。オフセットはコンパイル中にセットされる。
この方法は、検索されたオフセットをその値として返送する。
IFuncInfo::GetFuncKind
方法GetFuncKindは、このIFuncInfoオブジェクトにより
定義されたファンクションのファンクションカインド(例えば、仮想、スタティ
ック、等)を検索する。この方法は、検索されたファンクションカインドをその
値として返送する。
IFuncInfo::SetFuncDesc
方法SetFuncDescは、指定されたIFuncDescオブジェクト
をこのIFuncInfoオブジェクトにより定義されたファンクションの原型
情報として記憶する。
IFuncInfo::SetPropKind
方法SetPropKindは、指定された特性カインドを、このIFunc
Infoオブジェクトにより定義されたファンクションの特性カインドとして記
憶する。
IFuncInfo::SetPure
方法SetPureは、指定されたフラグを、このIFuncInfoオブジ
ェクトにより定義されたファンクションの純粋なフラグとして記憶する。
IFuncInfo::SetFunkKind
方法SetFuncKindは、指定されたファンクションカインドを、この
IFuncInfoオブジェクトにより定義されたファンクションのファンクシ
ョンカインドとして記憶する。
テーブル8
interface IFuncDesc {
virtual SCODE GetTypeDescResult(ITypeDesc**lplptdesc)=0;
virtual UNIT GetParamCount()=0;
virtual SCODE GetParam(UNIT index,IParamInfo**lplpparaminfo)=0;
virtual CALLINGCONVENTION GetCallingConvention()=0;
virtual SCODE GetTypeDescThis(ITypeDesc**lplptdescThis)=0;
virtual BOOL HasAnyNumArgs()=0;
virtual UNIT GetOptionalArgs()=0;
virtual SCODE SetTypeDescResult(ITypeDesclptdesc)=0;
virtual SCODE AddParam(UNIT index,IParaminfo**lpparaminfo)=0;
virtual SCODE RemParam(UNIT index)=0;
virtual SCODE SetCallingConvention(CALLINGCONVENTION ccFunc)=0;
virtual SCODE SetTypeDescThis(ITypeDesc*lptdescThis)=0;
virtual SCODE SetAnyNumArgs(BOOL hasAnyNumArgs)=0;
virtual SCODE SetOptionaIArgs(UNIT cOptionalArgs)=0;
};
IFuncDescインターフェィス
IFuncDescインターフェイスは、IFuncInfoオブジェクトの
方法を定義する。IFuncDescインターフェイスは、ファンクション原型
定義をアクセスするメカニズムを与える。テーブル8は、IFuncDescイ
ンターフェイスをリストする。
IFuncDesc::GetTypeDescResult
方法GetTypeDescResultは、このIFuncDescオブジ
ェクトにより定義されたファンクションの返送タイプを定義するITypeDe
scオブジェクトを検索する。この方法は、ITypeDescオブジェクトの
ポインタをパラメータとして返送する。
IFuncDesc::GetParamCount
方法GetParamCountは、このIFuncDescオブジェクトに
より定義されたファンクションの公式なパラメータの数を検索する。この方法は
この数をその値として返送する。この数はこのファンクションにより必要とされ
るパラメータの最小数を指示する。付加的なパラメータは、タイプ変数のもので
ある。
IFuncDesc::GetParam
方法GetParamは、このIFuncDescオブジェクトにより定義さ
れたファンクションの指定のインデックスの公式なパラメータを定義するIPa
ramInfoオブジェクトを検索する。この方法は、IParamInfoオ
ブジェクトのポインタをパラメータとして返送する。
IFuncDesc::GetCallingConvention
方法GetCallingConventionは、このIFuncDesc
オブジェクトにより定義されたファンクションのコーリングコンベンション(例
えば、パスカル、C++)を検索する。この方法は、検索されたコーリングコン
ベンションをその値として返送する。
IFuncDesc::GetTypeDescThis
方法GetTypeDescThisは、このIFuncDescオブジェク
トにより定義されたファンクションのTHISポインタ(例えば、近、遠)のタ
イプを定義するITypeDescオブジェクトを検索する。この方法は、IT
ypeDescオブジェクトのポインタをパラメータとして返送する。このファ
ンクションがスタティックである場合には、この方法はポインタをNULLにセ
ットする。
IFuncDesc::HasAnyNumArgs
方法HasAnyNumArgsは、このIFuncDescオブジェクトに
より定義されたファンクションがパラメータの変数をサポートするかどうかを示
すフラグを検索する。この方法は、検索されたフラグをその値として返送する。
IFuncDesc::GetOptionalArgs
方法GetOptionalArgsは、このIFuncDescオブジェク
トにより定義されたファンクションがサポートするオプションのパラメータの数
を検索する。この方法は、検索された数をその値として返送する。
IFuncDesc::SetTypeDescResult
方法SetTypeDescResultは、指定されたITypeDesc
オブジェクトを、このIFuncDescオブジェクトにより定義されたファン
クションの返送タイプとして記憶する。
IFuncDesc::AddParam
方法AddParamは、このIFuncDescオブジェクトにより定義さ
れたファンクションのパラメータの指定のインデックスの前に指定のIPara
mInfoオブジェクトを追加する。ファンクションに対して現在定義されてい
るパラメータの数に等しいインデックスを指定することにより新たなパラメータ
を添付することができる。
IFuncDesc::RemParam
RemParamは、このIFuncDescオブジェクトにより定義された
ファンクションの公式パラメータリストから指定のインデックスの公式パラメー
タを除去する。
IFuncDesc::SetCallingConvention
方法SetCallingConventionは、指定のコーリングコンベ
ンションを、このIFuncDescオブジェクトにより定義されたファンクシ
ョンのコーリングコンベンションとして記憶する。
IFuncDesc::SetTypeDescThis
方法SetTypeDescThisは、このIFuncDescオブジェク
トにより定義されたファンクションのTHISポインタのタイプを定義するため
に指定のITypeDescオブジェクトを記憶する。
IFuncDesc::SetAnyNumArgs
方法SetAnyNumArgsは、指定された数を、このIFuncDes
cオブジェクトにより定義されたファンクションのオプションのパラメータの数
として記憶する。HasAnyNumArgsフラグが偽である場合には、この
方法はエラーを返送する。最後の公式パラメータが変数の配列でない場合には、
この方法はエラーを返送する。
IFuncDesc::SetOptionalArgs
方法SetOptionalArgsは、指定の数を後続のオプションパラメ
ータの数として記憶する。最後の公式パラメータが変数でない場合は、この方法
はエラーを返送する。
テーブル9
class IParaminfo{
virtual SCODE GetParamName(LPBSTR lpbstrParamName)=0;
virtual SCODE GetDocumentation(BSTR*lpbstrDoc)=0;
virtual SCODE GetTypeDesc(ITypeDesc**lplptdesc=0;
virtual SCODE SetParamName(LPSTR szName)=0;
virtual SCODE SetDocumentation(LPSTR szDoc)=0;
virtual SCODE SetTypeDesc(ITypeDesc*lptdesc)=0;
};
IParamInfoインターフェイス
IparamInfoインターフエイスは、IparamInfoオブジェク
トの方法を定義する。IparamInfoオブジェクトは、公式なパラメータ
を定義するメカニズムを与える。テーブル9は、IParamInfoインター
フェイスをリストしたものである。
IParamInfo::GetParamName
方法GetParamNameは、このIParamInfoオブジェクトに
より定義された公式パラメータの名前を検索する。この名前は、名前の付けられ
たパラメータコール構文(例えば、ParamB=104)をサポートする言語
により使用される。この方法は、検索された名前をパラメータとして返送する。
IParamInfo::GetDocumentation
方法GetDocumentationは、このIParamInfoオブジ
ェクトにより定義された公式パラメータの記述を含むストリングを検索する。検
索されたストリングは、パラメータとして返送される。
IParamInfo::GetTypeDesc
方法GetTypeDescは、このIParamInfoオブジェクトによ
り定義された公式パラメータのタイプを定義するITypeDescオブジェク
トを検索する。この方法は、検索されたITypeDescオブジェクトのポイ
ンタをパラメータとして返送する。
IParamInfo::SetParamName
方法SetParamNameは、指定された名前を、このIParamIn
foオブジェクトにより定義された公式パラメータの名前として記憶する。
IParamInfo::SetDocumentation
方法SetDocumentationは、指定されたストリングを、このI
ParamInfoオブジェクトにより定義された公式パラメータのドキュメン
テーションとして記憶する。
IParamInfo::SetTypeDesc
方法SetTypeDescは、このIParamInfoオブジェクトによ
り定義された公式パラメータのタイプを定義するために指定のITypeDes
cオブジェクトを記憶する。
テーブル10
interface ITypeBind {
virtual SCODE GetTypeInfoContainer(ITypeInfo**lplptinfoContainer)=0;
virtual UNIT GetCbSize()=0;
virtual UNIT GetAligment()=0;
virtual UNIT GetCbSizeVft()=0;
Virtual SCODE Bind(HGNAM hgname,KIND*lpbkind,VOID**lplplIxxxinfo)=0;
Virtual SCODE BindProperty(HGNAM hgname,IFuncInfo**lplpfinfoGet,
IFuncInfo**lplpfinfoPut,
IFuncInfo**lplpfinfoRefPut=0;
Virtual SCODE BindType(HGNAM hgname,ITYPEBIND**lplpitypebind)=0;
virtual BOOL CanCast(ITypeInfo*lptinfoBase)=0;
Virtual SCODE GetOverridenFunction(IFuncinfo*lpfinfo,IFuncInfo**
lplpfinfoOverriden)=0;
};
ITypeBindインターフェイス
ITypeBindインターフェイスは、ITypeBindオブジェクトの
方法を定義する。ITypeBindインターフェイスは、コンテナオブジェク
トタイプを用いてコンパイルするに必要な情報をコンパイラーが検索するための
メカニズムを与える。コンパイラーは、ITypeBindオブジェクトの方法
を呼び出し、コンテナオブジェクトタイプで定義されたタイプのオブジェクトの
インスタンスへ結合する。好ましい実施例では、結合名(メンバー名及びタイプ
名)は、名前テーブルに対するハンドル(hgnam)として表される。このよ
うに、結合名は、ストリングを用いるのではなく、ハンドルにより結合中に効率
的に識別できる。コンパイラーは、ITypeBindインターフェイスの方法
を呼び出す前に、各結合名を名前ハンドルに変換する。タイプライブラリーは、
この変換に対してグローバルなファンクションを供給する。テーブル10は、I
TypeBindインターフェイスをリストしたものである。
ITypeBind::GetTypeInfoContainer
方法GetTypeInfoContainerは、このITypeBind
オブジェクトのコンテナオブジェクトタイプを定義するITypeInfoオブ
ジェクトを検索する。この方法は、検索されたITypeInfoオブジェクト
のポインタをパラメータとして検索する。
ITypeBind::GetCbSize
方法GetCbSizeは、このITypeBindオブジェクトにより定義
されたオブジェクトタイプのオブジェクトのサイズを検索する。このサイズは、
インスタンスデータのサイズである。この方法は、検索されたサイズをその値と
して返送する。
ITypeBind::GetAlignment
方法GetAlignmentは、このITypeBindオブジェクトのコ
ンテナオブジェクトタイプの埋め込まれたオブジェクトに対するアライメントを
検索する。この方法は、アライメントをその値として返送する。
ITypeBind::GetCbSizeVft
方法GetCbSizeVftは、このITypeBindオブジェクトのコ
ンテナオブジェクトタイプに対する仮想ファンクションテーブルのサイズを検索
する。この方法は、検索されたサイズをその値として返送する。
ITypeBind::Bind
方法Bindは、このITypeBindオブジェクトにより定義されたコン
テナタイプ内の指定の名前ハンドルに合致するメンバーを定義するIVarIn
fo又はIFuncInfoオブジェクトを検索する。この方法は、メンバーが
特性であるかどうかの指示子を返送する。メンバーが特性である場合には、方法
BindPropertyを次に呼び出さねばならない。この方法は、IVar
Info又はIFuncInfoオブジェクトのポインタをパラメータとして返
送する。
ITypeBind::BindProperty
方法BindPropertyは、このITypeBindオブジェクトのコ
ンテナオブジェクトタイプの指定の名前ハンドルに合致するメンバーの特性取得
(get property)ファンクション及び特性入力(put property)ファンクション
を定義するIFuncInfoオブジェクトを検索する。この方法は、IFun
cInfoオブジェクトに対するポインタを返送する。
ITypeBind::BindType
方法BindTypeは、指定のタイプ名に合致するタイプを定義するITy
peBindオブジェクトを検索する。この方法は、方法ITypeLib::
GetTypeBindにより返送されたITypeBindオブジェクトに基
づいて呼び出され、そのライブラリー内に定義されたタイプに結合する。又、こ
の方法は、ネストされたタイプに結合するのにも使用される。
ITypeBind::CanCast
方法CanCastは、このITypeBindオブジェクトのコンテナオブ
ジェクトタイプのベースメンバーを定義するITypeInfoオブジェクトを
検索する。別の実施例においては、多数の継承を受け入れるために、IType
Bindオブジェクトのアレーが検索される。この方法は、検索されたITyp
eBindインスタンスに対するポインタを返送する。
ITypeBind::GetOverridenFunction
方法GetOverridenFunctionは、このITypeBind
オブジェクトのコンテナオブジェクトタイプのファンクションメンバーを定義す
る指定のIFuncInfoオブジェクトにより定められたファンクションと原
型が同一であるような仮想ファンクションメンバーを定義するIFuncInf
oオブジェクトを検索する。この方法は、検索されたIFuncInfoオブジ
ェクトに対するポインタをパラメータとして返送する。
テーブル11
class ITypeFixups {
virtual SCODE GetTypeInfoContainer(ITypeInfo**lplptinfoContainer)=0;
virtual UNIT AddressofMember(HMEMBER hmember,VOID**lplpvoid)=0;
};
ITypeFixupsインターフェイス
ITypeFixupsインターフェイスは、ITypeFixupsオブジ
ェクトの方法を定義する。ITypeFixupsインターフェイスは、スタテ
ィックファンクションメンバー、スタティックデータメンバー及びグローバルな
ファンクション及びデータのアドレスをローダが検索するためのメカニズムを与
える。テーブル11は、ITypeFixupsインターフェイスをリストした
ものである。
ITypeFixups::GetTypeInfoContainer
方法GetTypeInfoContainerは、このITypeFixu
psオブジェクトのコンテナオブジェクトタイプを定義するITypeInfo
オブジェクトを検索する。この方法は、検索されたITypeInfoオブジェ
クトに対するポインタをパラメータとして返送する。
ITypeFixups::AddressOfMember
方法AddressOfMemberは、このITypeFixupsオブジ
ェクトのコンテナオブジェクトタイプの指定のメンバーのアドレスを検索する。
指定のメンバーがスタティックファンクションメンバー又はグローバルなファン
クションである場合には、この方法は、ダイナミックリンクライブラリーからフ
ァンクションを具現化するコードをロードする。別の実施例では、タイプライブ
ラリーが最初にオープンしたときに、全てのスタティックファンクションメンバ
ー及びグローバルなファンクションをロードすることができる。又、ファンクシ
ョンは、個別のダイナミックリンクライブラリーではなくてタイプライブラリー
に直接記憶することができる。この方法は、アドレスをその値として返送する。
補助ファンクション
本発明は、種々の補助ファンクションを提供する。これら補助ファンクション
は、アプリケーションがタイプライブラリーをオープンしそして種々のインター
フェイスオブジェクトをインスタンス生成するためのメカニズムを与える。例え
ば、ファンクションCreateITypeDescは、初期化されたITyp
eDescオブジェクトを形成しそしてこのオブジェクトに対するポインタを返
送する。これらのファンクションは、ライブラリーをオープンするファンクショ
ンを除いて、タイプライブラリー内のグローバルなファンクションとして定義す
ることができる。
継続例
コードテーブル2ないし5は、タイプライブラリーへのクラス定義の追加を示
す擬似コードをリストしたものである。コードテーブル2は、ルーチンAddC
lassの擬似コードをリストしたものである。このルーチンAddClass
には、指定のクラス定義を追加すべきところのITypeLibオブジェクトに
対するポインタが通される。ライン2において、このルーチンは、指定のクラス
定義を通すルーチンGenerateClassTypeInfoを呼び出す。
このルーチンGenerateClassTypeInfoは、初期化されたI
TypeInfoオブジェクトを指定のクラス定義と共に返送する。ライン3に
おいて、このルーチンは、指定のITypeLibオブジェクトにITypeI
nfoオブジェクトを追加する。
コードテーブル2
1 AddClass(definition,ptlib);
2 {GenerateClassTypeInfo(class_defini,ptinfo);
3 ptlib->AddTypeInfo(ptinfo);
};
コードテーブル3は、ルーチンGenerateClassTypeInfo
の擬似コードをリストしたものである。このルーチンGenerateClas
sTypeInfoは、クラス定義(例えば、名前、メンバー名)が通され、そ
のクラスを記述するに必要な全てのオブジェクトをインスタンス生成し、そして
そのクラスを定義するITYpeInfoオブジェクトを返送する。ライン2に
おいて、このルーチンは、初期化されていないITypeInfoオブジェクト
をインスタンス生成するためにルーチンCreateTypeInfoを呼び出
す。ライン3、4及び5において、このルーチンは、クラスの種々の属性をセッ
トする。ドキュメンテーション、ヘルプファイル等を含むクラスの他の属性をセ
ットすることもできる。ライン6において、このルーチンは、初期化されていな
いITypeMembersオブジェクトを検索するために方法GetType
Membersを呼び出す。ライン7ないし10、11ないし14、15ないし
18において、このルーチンは、データメンバー、ファンクションメンバー及び
ベースメンバーの定義をITypeMembersオブジェクトに追加する。デ
ータメンバーの記述を追加するステップについては以下で説明する。当業者であ
れば、ファンクションメンバーとベースメンバーを追加する説明は同様であるこ
とが明らかであろう。ライン7ないし10において、このルーチンは、クラスの
全てのデータメンバーの定義をITypeMembersに追加する。ライン7
において、このルーチンは、データメンバーをインデックスするのに使用される
変数iを初期化する。ライン8ないし10において、このルーチンは、各データ
メンバーの定義を追加するようにループする。ライン9において、このルーチン
は、データメンバー定義及びITypeInfoオブジェクトを通すルーチンG
enerateDataInfoを呼び出す。このルーチンGenerateD
ataInfoは、データメンバーの定義を含むIVarInfoオブジェクト
を返送する。ライン10において、このルーチンは、IVarInfoオブジェ
クトをITypeMembersオブジェクトに追加する。
コードテーブル3
1 GenerateClassTypeInfo(class_definit,ptinfo)
2 {CreateTypeInfo(ptinfo);
3 ptinfo->setName(name);
4 ptinfo->SetTypeKind(CLASS);
5 ptinfo->SetAlignment(alignment);
6 ptinfo->GetTypeMembers(ptmembers);
7 i=0;
8 for(各データメンバー)
9 {GenerateDataInfo(datainfo,pvinfo);
10 ptmembers->AddVar(i++,pvinfo)};
11 i=0;
12 for(各ファンクションメンバー)
13 {GenerateFuncInfo(funcinfo,pfinfo);
14 ptmembers->AddFunc(i++,pfinfo)};
15 i=0;
16 for(各ベースクラス)
17 {GenerateBaseInfo(baseinfo,pvinfo);
18 ptmembers->AddBase(i++,pvinfo)};
}
コードテーブル4は、ルーチンGenerateDataInfoに対する擬
似コードをリストしたものである。このルーチンGenerateDataIn
foは、データメンバーを定義する情報が通され、データメンバーを定義するI
VarInfoオブジェクトを発生し、そしてVarInfoオブジェクトを返
送する。ライン2において、このルーチンは、初期化されていないIVarIn
foオブジェクトを形成するルーチンCreateVarInfoを呼び出す。
ライン5において、このルーチンは、IVarInfoインスタンスの名前をデ
ータメンバーの名前にセットする。ライン6において、このルーチンは、指定の
データメンバーに対するITypeDescインスタンスを形成しそして初期化
するためにルーチンGenerateTypeDescを呼び出す。ライン7に
おいて、このルーチンは、ITypeDescインスタンスに対するポインタを
IVarInfoインスタンスに記憶する。ライン8及び9において、このルー
チンは、データメンバーの種々の属性をセットする。
コードテーブル4
1 GenerateDataInfo(varinfo,pvinfo)
2 {CreateVarInfo(pvinfo);
3 \*;
4 set variable kind to data member;
5 pvinfo->SetName(data member name);
6 GenerateTypeDesc(typedesc,ptdesc);
7 pvinfo->SetTypeDesc(ptdesc);
8 if(variable is static)pvinfo->SetStatic(true);
9 if(variable is constant)pvinfo->SetVal(constant value);
}
コードテーブル5は、ルーチンGenerateTypeDescに対する擬
似コードをリストしたものである。このルーチンGenerateTypeDe
scは、タイプ定義及びITypeInfoオブジェクトが通され、IType
Descオブジェクトを形成及び初期化し、そしてITypeDescオブジェ
クトを返送する。ライン2において、このルーチンは、初期化されていないIT
ypeDescオブジェクトを形成するためにルーチンCreateTypeD
escを呼び出す。ライン3において、このルーチンは、ITypeInfoオ
ブジェクトに対するポインタをセットする。ライン4において、このルーチンは
ITypeDescオブジェクトの変数カインドをセットする。ライン4ないし
6において、変数が導出されたタイプである場合には、このルーチンは、ルーチ
ンGenerateTypeDescを繰り返し呼び出すことによりその導出さ
れたタイプに対するITypeDescオブジェクトを発生し、そしてその導出
されたタイプに対するITypeDescオブジェクトのポインタを記憶する。
ライン7ないし11において、このルーチンは、種々の属性をセットし、そして
変数がファンクションを指すときにIFuncDescインスタンスを形成し、
初期化する。
コードテーブル5
1 GenerateTypeDesc(typedesc,ptdesc);
2 {CreateTypeDesc(ptdesc);
3 ptdesc->SetVarType(variabletype);
4 if(type has base)
5 {GenerateTypeDesc(typedesc_of_basis,ptdesc_for_basis);
6 ptdesc->SetTypeDescBasis(ptdescforbasis)};
7 if(type is constant)ptdesc->SetConst(true);
8 if(type is volatile)ptdesc->SetVolatile(true);
9 if(type is pointer to function)
10 {GenerateFuncDesc(functionname,pfdesc);
11 ptdesc->SetFuncDesc(pfdesc)};
}
図8は、マクロインタープリターがコードテーブル1のマクロを解読するため
に実行するステップを示す図である。図8は、マクロインタープリターの流れ線
図を表すものでなく、コードテーブル1のマクロを解読するときにマクロインタ
ープリターが実行するステップを表している。ステップ801において、マクロ
インタープリターは、ワードプロセッサのタイプライブラリーをオープンする。
タイプライブラリーがオープンされると、ITypeLibオブジェクトに対す
るポインタが変数ptlibにおいて返送される。ステップ802において、マ
クロインタープリターは、ドキュメントタイプのポインタである変数pdocに
対しメモリを割り当てる。ステップ803では、マクロインタープリターは、パ
ラグラフタイプのポインタである変数pparaに対しメモリを割り当てる。ス
テップ804において、マクロインタープリターは、コードテーブル1のライン
3を解読する。マクロインタープリターは、そのルーチンExecuteGlo
balFunctionを呼び出し、これに、オープンタイプライブラリーのポ
インタ、グローバルファンクションGetDocの名前、及びパラメータがない
という指示を通す。このルーチンは、ワードプロセッサにおけるオープンドキュ
メントのドキュメントオブジェクトに対するポインタをその値として返送する。
ステップ850において、マクロインタープリターは、変数pdocを返送値に
セットする。ステップ806において、マクロインタープリターは、コードテー
ブル1のライン4を解読する。マクロインタープリターは、変数iを0にセット
する。ステップ807ないし810において、マクロインタープリターは、コー
ドテーブル1のライン5及び6を解読する。ステッブ807において、マクロイ
ンタープリターは、ルーチンExecuteMemberFunctionを呼
び出し、オーブンライブラリーのITypeLibオブジェクトのポインタ、ド
キュメントオブジェクトのポインタ、ポインタがドキュメントオブジェクトタイ
プに対するものであるという指示、実行すべきファンクションメンバー(Get
Para)の名前、及びパラメータの指示の数を通す。このルーチンは、Get
Paraファンクションメンバーの結果を返送する。GetParaファンクシ
ョンメンバーは、指定されたインデックスのパラグラフオブジェクトのポインタ
を返送する。ステップ808において、マクロインタープリターは、変数ppa
raを返送値に等しくセットする。ステップ809において、変数pparaが
ナルに等しい場合には、全てのパラグラフが処理されており、マクロインタープ
リターはコードテーブル1の解読を終了し、さもなくば、マクロインタープリタ
ーはステップ810に続く。ステップ810では、マクロインタープリターは、
ルーチンExecuteFunctionMemberを呼び出し、オープンラ
イブラリーのITypeLibオブジェクトのポインタ、パラグラフオブジェク
トのポインタ、パラグラフオブジェクトのポインタがパラグラフを指していると
いう指示、実行すべきパラグラフオブジェクトのファンクションメンバーの名前
(SetJustify)、及びパラメータ「right」を通す。ファンクシ
ョンメンバーSetJustifyは、返送値をもたない。次いで、マクロイン
タープリターは、ステップ807へループし、コードテーブル1のライン5及び
6のループの実行を続ける。
図9は、ルーチンExecuteGlobalFunctionの流れ線図で
ある。このルーチンは、グローバルファンクションのアドルスを決定し、そのグ
ローバルファンクションに対するパラメータをプッシュし、グローバルファンク
ションを呼び出し、そしてグローバルファンクションの値を返送する。このルー
チンには、ITypeLibのポインタ、実行すべきグローバルファンクション
の名前、及びファンクションに対するパラメータが通される。このルーチンは、
グローバルファンクションの値を返送する。ステップ901において、このルー
チンは、ルーチンGetAddressOfGlobalFunctionを呼
び出し、ITypeLibオブジェクトのポインタ、ファンクション名及びパラ
メータをそこに通す。ルーチンGetAddressOfGlobalFunc
tionは、ワードプロセッシングプログラム内の指定の名前のグローバルファ
ンクションのアドレスを返送する。ステップ902において、このルーチンは、
パラメータをプッシュする。パラメータをプッシュするステップは、グローバル
ファンクションのコールコンベンションに基づいている。ステップ903におい
て、このルーチンは、グローバルファンクションを呼び出す。ステップ904に
おいて、このルーチンは、グローバルファンクションの値を返送値として記憶し
そしてそれ自体を返送する。
図10は、ルーチンGetAddressOfGlobalFunction
の流れ線図である。このルーチンGetAddressOfGlobalFun
ctionは、タイプライブラリーをアクセスして、指定のグローバルファンク
ションのアドレスを決定する。このルーチンには、ITypeLibオブジェク
トのポインタ、グローバルファンクションの名前、グローバルファンクションへ
通すためのパラメータが通される。このルーチンは、グローバルファンクション
のアドレスを返送する。ステップ1001において、このルーチンは、ルーチン
BindToGlobalFunctionを呼び出し、これにITypeLi
bオブジェクトのポインタ及びグローバルファンクションの名前を通す。このル
ーチンBindToGlobalFunctionは、指定のグローバルファン
クションに対するITypeBindオブジェクトのポインタを返送する。ステ
ップ1002において、このルーチンは、ルーチンGetFuncInfoを呼
び出し、これにITypeBindオブジェクトのポインタを通す。このルーチ
ンGetFuncInfoは、グローバルファンクションに対するIFuncI
nfoオブジェクトのポインタを返送する。ステップ1003において、このル
ーチンは、ルーチンValidateParametersを呼び出し、これに
パラメータ及びIFuncInfoオブジェクトのポインタを通す。このルーチ
ンValidateParametersは、指定のパラメータがIFuncI
nfoオブジェクトにおいて特定された公式パラメータに一致するかどうかを決
定する。ステップ1004において、このルーチンは、ルーチンGetAddr
essを呼び出し、これにIFuncInfoオブジェクトのポインタを通す。
このルーチンGetAddressは、IFuncInfoオブジェクトに対応
するアドレスを返送する。ルーチンGetAddressOfGlobalFu
nctionは、次いで、復帰する。
コードテーブル6は、ルーチンBindToGlobalFunctionの
擬似コードをリストしたものである。このルーチンBindToGlobalF
unctionは、ITypeLibオブジェクトのポインタ及びグローバルフ
ァンクションの名前を入力する。このルーチンは、指定されたファンクションに
対するITypeBindオブジェクトを検索し、そしてそのオブジェクトに対
するポインタを返送する。このルーチンは、MODULEのタイプカインドを有
するタイプライブラリー内の各ITypeInfoオブジェクトを通してサーチ
することによりITypeBindオブジェクトを検索する。このルーチンは、
ITypeInfoオブジェクト内の各ファンクションをチェックして、それが
指定の名前に一致するかどうかを決定する。指定の名前に一致する場合には、次
いで、このルーチンは、そのファンクションに対するITypeBindオブジ
ェクトを検索し、復帰となる。別の実施例では、方法ITypeLib::Ge
tTypeBind()を用いて、ITypeBindインスタンスを検索し、
これにより、指定の名前のグローバルファンクションに対するITypeBin
dオブジェクトを検索することができる。又、別の実施例においては、ルーチン
BindToGlobalFunctionは、最初のグローバルファンクショ
ンが見つかったときに復帰するのではなく、指定の名前をもつ多数のグローバル
ファンクションが定義されたかどう判断するようにチェックする。
コードテーブル6
1 BindToGlobalFunction(ptlib,fname,pbind)
2 {count=ptlib->GetTypeInfoCount();
3 for(i=0;i<count;i++)
4 {ptlib->GetTypeInfo(i,ptinfo);
5 if ptinfo->GetTypeKind()==MODULE
6 {ptinfo->GetTypeMembers(ptmembers);
7 fcount=ptmembers->GetFuncCount();
8 for(j:0;j<fcount;j++)
9 {ptmembers->GetFunc(j,pfinfo);
10 pfinfo->GetName(name);
11 if fname=name
12 {ptinfo->GetTypeBind(&ptbind);
13 return}}}}};
}
コードテーブル7は、ルーチンGetFuncInfoに対する擬似コードを
リストしたものである。このルーチンGetFuncInfoには、IType
Bindオブジェクトのポインタ及び結合すべきファンクションの名前が通され
る。このルーチンは、指定のファンクションに対しIFuncInfoオブジェ
クトのポインタを返送する。
コードテーブル7
1 GetFuncInfo(ptbind,fname,pfinfo);
2 {ptbind->Bind(fname,BINDKIND_FUNCTION,pfinfo);
}
コードテーブル8は、ルーチンValidateParametersの擬似
コードをリストするものである。このルーチンは、パラメータのリスト及びIF
uncInfoオブジェクトのポインタを受け取る。このルーチンは、指定のパ
ラメータがIFuncInfoインスタンスの公式パラメータに一致するかどう
か決定する。このルーチンは、パラメータが一致するかどうかの指示をその値と
して返送する。
コードテーブル8
1 ValidateParameters(parameters,pfinfo)
2 {pfinfo->GetFuncDesc(pfdesc);
3 for(i=0;i<pfdesc->GetParamCount();i++)
4 {pfdesc->GetParam(i,&ppinfo);
5 ppinfo->GetTypeDesc(ptdesc);
6 Determine if Parameters[i] matches type pointed to by ptdesc
7 if (!match) {return error}};
}
コードテーブル9は、ルーチンGetAddressの擬似コードをリストし
たものである。このルーチンは、IFuncInfoオブジェクトのポインタを
受け取り、そしてそのオブジェクトにより定義されたファンクションのアドレス
を返送する。このルーチンは、そのメンバーのハンドルを検索し、ITypeF
ixupsオブジェクトを使用して、アドレスを検索する。
コードテーブル9
1 GetAddress(pfinfo,address)
2 {Hmember=pfinfo->GetHmember();
3 pfinfo->GetTypeInfoContainer(ptinfo);
4 pfinfo->GetTypeFixups(ptfixups);
5 address=ptfixups->AddressOfMember(Hmember);
}
図11は、ルーチンExecuteFunctionMemberの流れ線図
である。このルーチンには、ITypeLibオブジェクトのポインタと、オブ
ジェクトのポインタと、オブジェクトのタイプと、ファンクションメンバーの名
前と、ファンクションメンバーへ通すためのパラメータとが通される。このルー
チンは、指定のオブジェクトの仮想ファンクションテーブル内のファンクション
メンバーのオフセットを決定し、そのファンクションを呼び出してそこにパラメ
ータを通し、そして指定のファンクションの値を返送する。ステップ1101に
おいて、このルーチンは、ルーチンGetOffsetOfFunctionM
emberを呼び出して、そこに、ITypeLibオブジェクトのポインタ、
指定のファンクションの名前、指定のファンクションがメンバーであるところの
オブジェクトのタイプ、及び指定のファンクションに対するパラメータを通す。
ルーチンGetOffsetOfFunctionMemberは、指定のオブ
ジェクトタイプの仮想ファンクションテーブル内の指定のファンクションメンバ
ーのオフセットを返送する。ステップ1103において、このルーチンはパラメ
ータをプッシュする。ステップ1104において、このルーチンは指定のオブジ
ェクトの指定のファンクションを呼び出す。ステップ1105において、このル
ーチンは指定のファンクションの返送値を記憶する。ルーチンExecuteF
unctionMemberは、次いで、復帰となる。
図12は、ルーチンGetOffsetOfFunctionMemberの
流れ線図である。このルーチンは、ITypeLibオブジェクトのポインタ、
ファンクションメンバーの名前、ファンクションメンバーのコンテナオブジェク
トタイプ、及びファンクションメンバーに通されるパラメータを入力する。この
ルーチンは、パラメータを有効化し、そしてコンテナオブジェクトタイプの仮想
ファンクションテーブルにおける指定のファンクションメンバーのオフセットを
返送する。ステップ1201において、このルーチンは、ルーチンBindTo
FunctionMemberを呼び出し、これに、指定のITypeLibオ
ブジェクトのポインタと、指定のコンテナオブジェクトタイプとを通す。このル
ーチンは、指定のコンテナオブジェクトタイプに対するITypeBindオブ
ジェクトのポインタを返送する。ステップ1202において、このルーチンは、
ルーチンGetFuncInfoを呼び出し、これに、指定のITypeInf
oオブジェクトのポインタと、指定のファンクションメンバーの名前とを通す。
このルーチンは、指定のファンクションに対するIFuncInfoオブジェク
トのポインタを返送する。ステップ1203において、このルーチンは、ルーチ
ンValidateParametersを呼び出し、これに、指定のパラメー
タと、指定のファンクションメンバーに対するIFuncInfoオブジェクト
のポインタとを通す。ステップ1205において、このルーチンは、ルーチンG
etOffsetを呼び出し、これに、指定のファンクションメンバーに対する
IFuncInfoオブジェクトのポインタを通す。このルーチンGetOff
setは、コンテナオブジェクトタイプの仮想ファンクションテーブル内の指定
のファンクションメンバーのオフセットを返送する。このルーチンGetOff
setは、次いで、復帰する。
コードテーブル10は、ルーチンBindToFunctionMember
の擬似コードをリストしたものである。このルーチンBindToFuncti
onMemberには、ITypeLibオブジェクトのポインタと、コンテナ
オブジェクトタイプの名前とが通される。このルーチンは、指定のコンテナオブ
ジェクトタイプに対するITypeBindオブジェクトに対するポインタを返
送する。
コードテーブル10
1 BindToFunctionMember(ptlib,type,ptbind)
2 {ptlib->GetIndexOfName(type,index);
3 ptlib->GetTypeInfo(index,ptinfo);
4 ptinf->GetTypeBind(ptbind);
}
コードテーブル11は、ルーチンGetOffsetの擬似コードをリストし
たものである。このルーチンGetOffsetは、IFuncInfoオブジ
ェクトが通され、そして指定のIFuncInfoオブジェクトにより定義され
たファンクションメンバーのオフセットを返送する。
コードテーブル11
1 GetOffset(pfinfo,offset)
2 {offset=pfinfo->GetOvft();
}
この実施例に述べたタイブライブラリーインターフェイスは、せいぜい1つの
ベースクラスで定義されたクラスをサポートすることが当業者に理解されよう。
─────────────────────────────────────────────────────
フロントページの続き
(72)発明者 カロン イーラン ジー
アメリカ合衆国 ワシントン州 98052
レッドモンド ワンハンドレッドアンドフ
ォーティセカンド アベニュー ノースイ
ースト 8411
(72)発明者 カーター アレン ダブリュー
アメリカ合衆国 ワシントン州 98008
ベルヴィュー サウスイースト ファース
ト ストリート 15940
(72)発明者 コーベット トム
アメリカ合衆国 オレゴン州 97401 ユ
ージーン オークモント ウェイ 2085
(72)発明者 ウルフ マイケル ジェイ
アメリカ合衆国 ワシントン州 98290
スノーホーミッシュ トゥーハンドレッド
アンドフィフティーンス プレイス サウ
スイースト 12126