(57)【特許請求の範囲】
【請求項１】
ＣＰＵ及びメモリを有するコンピュータシステムで実行される方法において、予めメモリに記憶されたプログラムの命令に基づいて、ＣＰＵがメモリ内でソースオブジェクトとシンクオブジェクトを相互接続するための方法であり、
シンクオブジェクトは、ソースオブジェクトから通信を受信するための通知インターフェースと、該通知インターフェースと対応付けられたインターフェース識別子を有し、
ソースオブジェクトは、複数の接続ポイントオブジェクトと接続ポイントコンテナオブジェクトを有し、
接続ポイントオブジェクトは、前記インターフェース識別子で識別された通知インターフェースを接続、切断するためのものであり、１つあるいはそれより多い通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンを記憶するものであり、
接続ポイントコンテナオブジェクトは、ソースオブジェクトの１つあるいはそれより多い事象に関連する要求で指示された特定のインターフェース識別子に対応する接続ポイントオブジェクトを見つけるためのものであり、ソースオブジェクトに収容された１つあるいはそれより多い接続ポイントオブジェクトヘの１つあるいはそれより多いポインタとインターフェース識別子のリストを有し、
当該方法は、
ソースオブジェクト内に収容された１つあるいはそれより多い接続ポイントオブジェクトヘの１つあるいはそれより多いポインタとインターフェース識別子のリストを使って、シンクオブジェクトの通知インターフェースに対応付けられたインターフェース識別子に基づいてソースオブジェクトの事象に関連する要求を認識し、
前記認識された要求によって指示されたインターフェース識別子に基づいて、接続ポイントオブジェクトを検索し、見つかったときはその接続ポイントオブジェクトを選択し、見つからない場合は新たに接続ポイントオブジェクトを生成し、
ソースオブジェクトの事象に関連する要求に対するシンクオブジェクトの通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンを取得し、前記選択又は新たに生成した接続ポイントオブジェクトに記憶し、
ソースオブジェクトが、システム事象を認識したときに、接続ポイントコンテナオブジェクトのインターフェース識別子及び前記ポインタのリストに基づいて接続ポイントオブジェクトを見つけ、接続ポイントオブジェクトの通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンに基づいて、ソースオブジェクトとシンクオブジェクトの間を相互接続させる方法。
【請求項２】
通知を、ソースオブジェクトからシンクオブジェクトに送るための、コンピュータシステムにおける方法であって、請求項１に記載の方法によってシンクオブジェクトがソースオブジェクトに接続され、
当該方法が更に、
ＣＰＵがソースオブジェクトを実行することによって、
シンクオブジェクトの通知インターフェースのメンバファンクションを呼び出す、ステップを含む方法。
【請求項３】
コンピュータシステムが、ソースオブジェクトとシンクオブジェクトとの間の接続を設定するための、メモリに記憶されたイニシエータオブジェクトを有する請求項１に記載の方法。
【請求項４】
ＣＰＵ及びメモリを持つコンピュータシステムにおいて実行される、メモリに予め記億されたプログラム命令に基づいて、ＣＰＵが、メモリ内で、ソースオブジェクトとシンクオブジェクトとの間のオブジェクト接続を発生する方法であって、シンクオブジェクトがソースオブジェクトにアクセスするための通知インターフェースを有し、
通知インターフェースが、対応付けられたインターフェース識別子を有し、
ソースオブジェクトは複数の接続ポイントオブジェクト及び接続ポイントコンテナオブジェクトを有し、
接続ポイントオブジェクトが、シンクオブジェクトの通知インターフェースを接続、及び、切断し、並びに、１つあるいはそれより多い通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンを記憶するためのものであり、接続ポイントオブジェクトの各々が、接続ポイントインターフェースを有し、接続ポイントオブジェクトが、接続ポイントコンテナオブジェクトによって管理され、
接続ポイントコンテナオブジェクトは、ソースオブジェクトの１つあるいはそれより多い事象に関連する要求で指示された特定のインターフェース識別子に対応する接続ポイントオブジェクトを見つけるためのものであり、ソースオブジェクトに収容された１つあるいはそれより多い接続ポイントオブジェクトヘの１つあるいはそれより多いポインタとインターフェース識別子のリストを有し、
当該方法は、
ソースオブジェクト内に収容された１つあるいはそれより多い接続ポイントオブジェクトヘの１つあるいはそれより多いポインタとインターフェース識別子のリストを使って、シンクオブジェクトの通知インターフェースに対応付けられたインターフェース識別子に基づいてソースオブジェクトの事象に関連する要求を認識し、
前記認識された要求によって指示されたインターフェース識別子に基づいて、接続ポイントオブジェクトを検索し、見つかったときはその接続ポイントオブジェクトを選択し、見つからない場合は新たに接続ポイントオブジェクトを生成し、
ソースオブジェクトの事象に関連する要求に対するシンクオブジェクトの通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンを取得し、前記選択又は新たに生成した接続ポイントオブジェクトに記憶し、
ソースオブジェクトが、システム事象を認識したときに、接続ポイントコンテナオブジェクトのインターフェース識別子及び前記ポインタのリストに基づいて接続ポイントオブジェクトを見つけ、接続ポイントオブジェクトの通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンに基づいて、ソースオブジェクトとシンクオブジェクトの間を相互接続させる方法。
【請求項５】
請求項４に記載の方法であって、
選択された接続ポイントインターフェースが、複数のシンクオブジェクトに接続するためのものである方法。
【請求項６】
接続ポイントコンテナオブジェクトが、接続ポイントインターフェースとの対話を管理するためのものである、請求項４に記載の方法。
【請求項７】
接続ポイントインターフェースが、ソースオブジェクトヘの接続を要求するためのアドバイスメンバファンクションを持つ請求項４に記載の方法。
【請求項８】
接続ポイントコンテナオブジェクトが、複数の接続ポイントオブジェクトとの対話を管理するためのものであり、
接続ポイントオブジェクトを選択するステップが、接続ポイントコンテナオブジェクトから接続ポイントオブジェクトを要求するサブステップを含む、請求項４に記職の方法。
【請求項９】
接続ポイントインターフェースがアドバイスメンバーファンクションを有し、選択された接続ポイントオブジェクトの接続ポイントインターフェースからの接続を要求するステップが、
要求をなすために、接続ポイントインターフェースのアドバイスメンバーファンクションを呼び出すことを含む、請求項４に記載の方法。
【請求項１０】
ＣＰＵ及びメモリを備えたコンピュータシステムにおいて実行される、メモリ内に予め記憶されたプログラムの命令に基づいて、ＣＰＵが、メモリに記憶されたソースオブジェクトと、メモリに記憶されたシンクオブジェクトとの間のオブジェクト接続を動的に発生する方法であって、
シンクオブジェクトがソースオブジェクトにアクセスするための通知インターフェースを有し、
通知インターフェースが、対応付けられたインターフェース識別子を有し、
ソースオブジェクトは複数の接続ポイントオブジェクト及び接続ポイントコンテナオブジェクトを有し、
接続ポイントオブジェクトが、シンクオブジェクトの通知インターフェースを接続、及び、切断し、並びに、１つあるいはそれより多い通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンを含む参照を記憶するためのものであり、接続ポイントオブジェクトの各々が、接続ポイントインターフェースを有し、接続ポイントオブジェクトが、接続ポイントコンテナオブジェクトによって管理され、
接続ポイントコンテナオブジェクトは、ソースオブジェクトの１つあるいはそれより多い事象に関連する要求で指示された特定のインターフェース識別子に対応する接続ポイントオブジェクトを見つけるためのものであり、ソースオブジェクトに収容された１つあるいはそれより多い接続ポイントオブジェクトヘの１つあるいはそれより多いポインタとインターフェース識別子のリストを有し、
当該方法は、
ソースオブジェクト内に収容された１つあるいはそれより多い接続ポイントオブジェクトヘの１つあるいはそれより多いポインタとインターフェース識別子のリストを使って、シンクオブジェクトの通知インターフェースに対応付けられたインターフェース識別子に基づいてソースオブジェクトの事象に関連する要求を認識し、
前記認識された要求によって指示されたインターフェース識別子に基づいて、接続ポイントオブジェクトを検索し、見つかったときはその接続ポイントオブジェクトを選択し、見つからない場合は新たに接続ポイントオブジェクトを生成し、
ソースオブジェクトの事象に関連する要求に対するシンクオブジェクトの通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンを取得し、前記選択又は新たに生成した接続ポイントオブジェクトに記憶し、
ソースオブジェクトが、システム事象を認識したときに、接続ポイントコンテナオブジェクトのインターフェース識別子及び前記ポインタのリストに基づいて接続ポイントオブジェクトを見つけ、接続ポイントオブジェクトの通知インターフェースに対応するポインタ及びシンクオブジェクトを識別するトークンに基づいて、ソースオブジェクトとシンクオブジェクトの間を相互接続させる方法。
【請求項１１】
ＣＰＵが、ソースオブジェクトを実行することによって、接続ポイントオブジェクト内に記憶された参照によって参照された通知インターフェースインスタンスのメソッドを呼び出すというステップを更に含む、請求項１０に記載の方法。
【請求項１２】
選択された接続ポイントオブジェクトが、複数のシンクオブジェクトに接続するためのものであり、
接続を要求し、選択された接続ポイントオブジェクト内に参照を記憶するステップが、各シンクオブジェクトに対して実行されるものであり、
更に、
ＣＰＵがソースオブジェクトを実行することによって、各シンクオブジェクトに対して、選択された接続ポイントオブジェクト内に記憶された参照によって参照された通知インターフェースのメソッドを呼び出す、
ステップを含む、請求項１０に記載の方法。
【請求項１３】
請求項補１０に記載の方法であって、
選択された接続ポイントインターフェースが、複数のシンクオブジェクトヘ接続するための．ものであり、
ソースオブジェクト及びシンクオブジェクトが接続されることを要求するための選択された接続ポイントインタフェースを使用し、選択された通知インターフェースインスタンスヘの参照を記憶するステップが、複数のシンクオブジェクトの各々について実行され、
更に、
ＣＰＵが、ソースオブジェクトを実行することによって、各シンクオブジェクトに対して、選択された接続ポイントインターフェースを有する接続ポイントオブジェクトに記憶された参照によって参照された通知インターフェースのメソッドを呼び出す、
ステップを含む方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は一般にオブジェクトを接続するためのコンピュータシステムに係り、より詳細には、通知の目的でオブジェクト接続を発生する方法及びシステムに係る。
【０００２】
【従来の技術】
ある事象が生じたときに他のソフトウェアとの通信を必要とするソフトウェアがしばしば形成される。例えば、コンピュータのウインドウシステムでは、ユーザがディスプレイ上のウインドウを選択したときに、ウインドウシステムは、ウインドウに情報を引き出すソフトウェアにウインドウが選択されたことを通知する必要がある。公知のシステムでは、ある事象の通知を必要とするソフトウェアは、それが通知しようとする事象を、その事象を引き起こしたソフトウェアと共に登録する。ある公知のシステムでは、登録機構の一部分として、通知を必要とするソフトウェアは、通知を行えるようにする通知ファンクションを登録する。従って、ソフトウェアが、既に登録されている事象を引き起こしたときには、その登録された通知ファンクションが呼び出される。これは、公知技術では、コールバック機構として知られている。
【０００３】
本発明は、オブジェクト指向の概念を用いて以下に説明するので、良く知られたオブジェクト指向のプログラミング技術の概要を述べることにする。オブジェクト指向のプログラミング言語の２つの共通の特徴は、データのカプセル化（エンキャプスレーション）及びデータタイプの継承に対するサポートである。データのカプセル化は、ファンクションとデータの結合を指す。継承は、あるデータのタイプを他のデータのタイプに関して宣言する能力を指す。
【０００４】
Ｃ＋＋言語においては、オブジェクト指向技術は、クラスの使用によってサポートされる。クラスとは、ユーザが定めるタイプである。クラスの宣言は、そのクラスのデータメンバー及びファンクションメンバーを記述する。例えば、次の宣言は、ＣＩＲＣＬＥと称するクラスのデータメンバー及びファンクションメンバーを定義する。
0004070248.tif 000002
変数ｘ及びｙは円の中心位置を指定し、そして変数ｒａｄｉｕｓは円の半径を指定する。これらの変数は、クラスＣＩＲＣＬＥのデータメンバーと称する。ファンクションｄｒａｗは、指定された半径の円を指定された位置に描くユーザが定めたファンクションである。ファンクションｄｒａｗは、クラスＣＩＲＣＬＥのファンクションメンバーと称する。ファンクションメンバーは、クラスのメソッドとも称する。クラスのデータメンバー及びファンクションメンバーは、ファンクションがクラスのインスタンスにおいて動作するという点で互いに結合される。クラスのインスタンスは、クラスのオブジェクトとも称する。
【０００５】
Ｃ＋＋の文法において、次のステートメントは、オブジェクトａ及びｂがタイプクラスＣＩＲＣＬＥのものであると宣言する。
CIRCLE a, b;この宣言は、オブジェクトａ及びｂに対してメモリの割り当てを生じる。次のステートメントは、オブジェクトａ及びｂのデータメンバーにデータを指定する。
a,x =2;
a,y =2;
a,radius=1;
b,x =4;
b,y =5;
b,radius=2;
次のステートメントは、オブジェクトａ及びｂにより定められた円を描くのに使用される。
a,draw();b,draw();
【０００６】
導出されたクラスとは、そのベースのクラスの特性、即ちデータメンバー及びファンクションメンバーを継承するクラスである。例えば、次の導出クラスＣＩＲＣＬＥ ＦＩＬＬは、ベースクラスＣＩＲＣＬＥの特性を継承する。
0004070248.tif 000003
この宣言は、クラスＣＩＲＣＬＥ ＦＩＬＬが、このクラスＣＩＲＣＬＥ ＦＩＬＬの宣言に導入されたデータ及びファンクションメンバー、即ちデータメンバーｐａｔｔｅｒｎ及びファンクションメンバーｆｉｌｌに加えて、クラスＣＩＲＣＬＥにある全てのデータ及びファンクションメンバーを含むことを指定する。この例では、クラスＣＩＲＣＬＥ ＦＩＬＬは、データメンバーｘ，ｙ、ｒａｄｉｕｓ及びｐａｔｔｅｒｎと、ファンクションメンバーｄｒａｗ及びｆｉｌｌとを有する。別のクラスの特性を継承するクラスは、導出されたクラス（例えば、ＣＩＲＣＬＥ ＦＩＬＬ）である。別のクラスの特性を継承しないクラスは、一次（ルート）クラス（例えば、ＣＩＲＣＬＥ）である。特性が別のクラスによって継承されるクラスは、ベースクラスである（例えば、ＣＩＲＣＬＥは、ＣＩＲＣＬＥ ＦＩＬＬのベースクラスである）。導出クラスは、多数のクラスの特性を継承することができ、即ち導出クラスは、多数のベースクラスをもつことができる。これは、多継承と称する。
【０００７】
導出クラスは、ベースクラスが仮想的に継承されるべきであることを指定してもよい。ベースクラスの仮想的な継承とは、導出クラスに仮想ベースクラスの１つのインスタンスしか存在しないことを意味する。例えば、２つの非仮想ベースクラスをもつ導出クラスの例を以下に示す。
class CIRCLE 1:CIRCLE｛... ｝;
class CIRCLE 2:CIRCLE｛... ｝;
class PATTERN:CIRCLE 1,CIRCLE 2 ｛... ｝;この宣言において、クラスＰＡＴＴＥＲＮは、クラスＣＩＲＣＬＥ １及びＣＩＲＣＬＥ ２を介してクラスＣＩＲＣＬＥを非仮想的に２回継承する。クラスＰＡＴＴＥＲＮには、クラスＣＩＲＣＬＥの２つのインスタンスがある。
【０００８】
２つの仮想ベースクラスをもつ導出クラスの例を以下に示す。
class CIRCLE＿1:virtual CIRCLE｛... ｝;
class CIRCLE＿2:virtual CIRCLE｛... ｝;
class PATTERN:CIRCLE＿1,CIRCLE＿2 ｛... ｝;
導出クラスＰＡＴＴＥＲＮは、クラスＣＩＲＣＬＥ １及びＣＩＲＣＬＥ ２を介してクラスＣＩＲＣＬＥを仮想的に２回継承する。クラスＣＩＲＣＬＥは仮想的に２回継承されるので、導出クラスＰＡＴＴＥＲＮにはクラスＣＩＲＣＬＥのオブジェクトが１つしかない。当業者に明らかなように、仮想的継承は、クラス導出がより複雑なときには非常に有用である。
【０００９】
又、クラスは、そのファンクションメンバーが仮想的であるかどうかを指定することもできる。ファンクションメンバーが仮想的であると宣言することは、導出クラスにおいて同じ名前及びタイプのファンクションによってそのファンクションをオーバーライドできることを意味する。以下の例では、ファンクションｄｒａｗは、クラスＣＩＲＣＬＥ及びＣＩＲＣＬＥ ＦＩＬＬにおいて仮想的であると宣言される。
0004070248.tif 000004
仮想ファンクションは、実施を与えずに宣言された場合には、純粋な仮想ファンクションと称される。純粋な仮想ファンクションとは、純粋な指定子「＝φ」で宣言される仮想ファンクションである。あるクラスが純粋な仮想ファンクションを指定する場合には、いかなる導出クラスも、そのファンクションメンバーが呼び出される前にそのファンクションメンバーに対する実施を指定することが必要となる。
【００１０】
オブジェクトをアクセスするために、Ｃ＋＋言語は、ポインタデータタイプを与える。ポインタは、メモリにおけるオブジェクトのアドレスである値を保持する。ポインタにより、オブジェクトを参照することができる。次のステートメントは、変数ｃ ｐｔｒをタイプクラスＣＩＲＣＬＥのオブジェクトにおけるポインタであると宣言し、そしてオブジェクトｃのアドレスを保持するよう変数ｃｐｔｒをセットする。
CIRCLE*c＿ptr;
c＿ptr=&c;
この例を続けると、次のステートメントは、オブジェクトａをタイプクラスＣＩＲＣＬＥであると宣言しそしてオブジェクトｂをタイプクラスＣＩＲＣＬＥ ＦＩＬＬであると宣言する。
CIRCLE a;
CIRCLE＿FILL b;
次のステートメントは、クラスＣＩＲＣＬＥで定義されたファンクションｄｒａｗを参照する。
a.draw();
これに対し、次のステートメントは、クラスＣＩＲＣＬＥ ＦＩＬＬで定義されたファンクションｄｒａｗを参照する。
b.draw();
更に、次のステートメントは、オブジェクトｂをタイプクラスＣＩＲＣＬＥのオブジェクトにタイプキャストし、そしてクラスＣＩＲＣＬＥ ＦＩＬＬで定義されたファンクションｄｒａｗを呼び出す。
CIRCLE*c＿ptr;
c＿ptr=&b;
c＿ptr->draw();                       //CIRCLE FILL::draw()
従って、呼び出された仮想ファンクションは、ファンクションＣＩＲＣＬＥ ＦＩＬＬ：：ｄｒａｗである。
【００１１】
図１は、オブジェクトを表すのに使用される典型的なデータ構造を示すブロック図である。オブジェクトは、オブジェクトの振る舞いを実施するインスタンスデータ（データメンバー）及びファンクションメンバーで構成される。オブジェクトを表すのに使用されるデータ構造は、インスタンスデータ構造１０１、仮想ファンクションテーブル１０２及びファンクションメンバー１０３、１０４、１０５を備えている。インスタンスデータ構造１０１は、仮想ファンクションテーブル１０２を指すポインタを含むと共に、データメンバーを含んでいる。仮想ファンクションテーブル１０２は、オブジェクトに対して定義された各仮想ファンクションメンバーのエントリーを含む。各エントリーは、それに対応するファンクションメンバーを実施するコードに対するレファレンスを含んでいる。このサンプルオブジェクトのレイアウトは、参考としてここに取り上げる「オブジェクト指向のプログラミング言語のためのコンパイラーにおいて仮想ファンクション及び仮想ベースを実施するための方法(A Method for Implementing Virtual Functions and Virtual Bases in a Compiler for an Object Oriented Programming Language) 」と題する米国特許出願第０７／６８２，５３７号に定められたモデルに合致するものである。以下の説明において、オブジェクトは、Ｃ＋＋プログラミング言語によって定義されたクラスのインスタンスとして説明する。当業者であれば、オブジェクトは、他のプログラミング言語を用いても定義されることが明らかであろう。
【００１２】
オブジェクト指向の技術を用いる利点は、これら技術を用いてオブジェクトの共有を容易にできることである。特に、オブジェクト指向の技術は、複合文書の形成を容易にする。複合文書とは、種々のコンピュータプログラムによって発生されたオブジェクトを含む文書である。（典型的に、オブジェクトのデータメンバー及びクラスタイプのみが複合文書に記憶される。）例えば、スプレッドシートプログラムによって発生されたスプレッドシートオブジェクトを含むワードプロセス文書は、複合文書である。ワードプロセスプログラムは、ユーザがスプレッドシートオブジェクト（例えば、セル）をワードプロセス文書内に埋め込みできるようにする。この埋め込みを行えるようにするため、ワードプロセスプログラムは、埋め込まれたオブジェクトのファンクションメンバーをアクセスするように、埋め込まれるべきオブジェクトのクラス定義を用いてコンパイルされる。従って、ワードプロセスプログラムは、ワードプロセス文書に埋め込みできる各クラスのオブジェクトのクラス定義を用いてコンパイルされる必要がある。新たなクラスのオブジェクトをワードプロセス文書に埋め込むためには、ワードプロセスプログラムは、新たなクラスの定義で再コンパイルされる必要がある。従って、ワードプロセスプログラムのデベローパ（開発プログラム）により選択されたクラスのオブジェクトしか埋め込むことができない。更に、新たなクラスは、ワードプロセスプログラムの新たなリリースでしかサポートできない。
【００１３】
任意のクラスのオブジェクトを複合文書に埋め込めるようにするために、ワードプロセスプログラムがコンパイル時にクラス定義にアクセスする必要なくオブジェクトをアクセスできるようなインターフェイスが定義される。アブストラクト（抽象）クラスは、実施を伴わない仮想ファンクションメンバー（純粋な仮想ファンクションメンバー）が少なくとも１つ存在するようなクラスである。インターフェイスは、データメンバーを伴わず仮想ファンクションが全て純粋であるようなアブストラクトクラスである。従って、インターフェイスは、２つのプログラムが通信するためのプロトコルを与える。インターフェイスは、典型的に、導出に使用され、プログラムは、クラスが導出されたインターフェイスのための実施を与えるクラスを実施する。その後、オブジェクトは、これら導出されたクラスのインスタンスとして形成される。
【００１４】
次のクラス定義は、インターフェイスの例示的な定義である。この例では、説明の簡略化のため、任意のクラスのオブジェクトを文書に埋め込みできるようにするのではなくて、ワードプロセスプログラムは、スプレッドシートオブジェクトを埋め込みできるようにする。このインターフェイスを与えるスプレッドシートオブジェクトは、オブジェクトがいかに実施されるかに係わりなく、埋め込むことができる。更に、スプレッドシートオブジェクトは、ワードプロセスプログラムがコンパイルされる前に実施されるかその後に実施されるかに係わりなく、埋め込むことができる。
0004070248.tif 000005
スプレッドシートプログラムのデベローパは、スプレッドシートオブジェクトをワードプロセス文書に埋め込めるようにするためのインターフェイスの実施を与えることが必要である。
【００１５】
ワードプロセスプログラムは、スプレッドシートオブジェクトを埋め込むときには、スプレッドシートオブジェクトのインターフェイスを実施するコードをアクセスする必要がある。クラスコードをアクセスするために、各実施には独特のクラス識別子が与えられる。例えば、マイクロソフト・コーポレーションにより開発されたスプレッドシートオブジェクトを実施するコードは、「ＭＳＳスプレッドシート」のクラス識別子を有するが、他社により開発されたスプレッドシートオブジェクトを実施するコードは、「ＬＴＳＳスプレッドシート」のクラス識別子を有する。クラスを実施するコードに対して各クラス識別子をマップする各コンピュータシステムの永続的登録が維持される。典型的に、スプレッドシートプログラムがコンピュータシステムに設置されるときには、そのクラスのスプレッドシートオブジェクトの利用性を反映するように永続的登録が更新される。スプレッドシートデベローパがインターフェイスにより定められた各ファンクションメンバーを実施しそして永続的登録が維持される限り、ワードプロセスプログラムは、デベローパのスプレッドシートオブジェクトのインスタンスをワードプロセス文書に埋め込むことができる。ワードプロセスプログラムは、その埋め込まれたスプレッドシートオブジェクトのファンクションメンバーを誰が実施したか又はどのように実施したかに係わりなく、これらファンクションメンバーにアクセスする。
【００１６】
しかしながら、種々のスプレッドシートデベローパは、あるファンクションメンバーのみを実施しようとする。例えば、あるスプレッドシートデベローパは、データベースサポートは実施しようとしないが、他の全てのファンクションメンバーをサポートしようとする。スプレッドシートデベローパがファンクションメンバーの幾つかだけをサポートできるようにする一方、オブジェクトを埋め込みできるようにするために、スプレッドシートオブジェクトの多数のインターフェイスが定義される。例えば、インターフェイスＩＤａｔａｂａｓｅ及びＩＢａｓｉｃは、スプレッドシートオブジェクトに対して次のように定義される。
0004070248.tif 000006
各スプレッドシートデベローパは、ＩＢａｓｉｃインターフェイスを実施し、そして任意に、ＩＤａｔａｂａｓｅインターフェイスを実施する。
【００１７】
実行時に、ワードプロセスプログラムは、埋め込まれるべきスプレッドシートオブジェクトがＩＤａｔａｂａｓｅインターフェイスをサポートするかどうかを決定する必要がある。この決定を行うために、オブジェクトに対してどのインターフェイスが実施されるかを指示するファンクションメンバーと共に別のインターフェイス（各スプレッドシートオブジェクトが実施する）が定義される。このインターフェイスは、ＩＵｎｋｎｏｗｎと称され（そして未知のインターフェイス又はオブジェクトマネージメントインターフェイスと称され）、次のように定義される。
0004070248.tif 000007
ＩＵｎｋｎｏｗｎインターフェイスは、ファンクションメンバー（メソッド）ＱｕｅｒｙＩｎｔｅｒｆａｃｅを定義する。このメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅには、パラメータｉｉｄ（タイプＲＥＦＩＥＬＤの）におけるインターフェイス識別子（例えば、ＩＤａｔａｂａｓｅ）が通され、そしてパラメータｐｐｖにおいてこのメソッドが呼び出されるところのオブジェクトに対し識別されたインターフェイスの実施を指すポインタを返送する。オブジェクトがインターフェイスをサポートしない場合には、このメソッドは偽を返送する。タイプＨＲＥＳＵＬＴは、予め定義された状態を指示し、そしてタイプＵＬＯＮＧは、非符号の長い整数を指示する。
0004070248.tif 000008
【００１８】
コードテーブル１は、クラスＩＵｎｋｎｏｗｎを継承するクラスＸＸのメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅの典型的な実施に対しＣ＋＋ソースコードのための擬似コードを含んでいる。スプレッドシートオブジェクトがＩＤａｔａｂａｓｅインターフェイスをサポートする場合には、メソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅは、スイッチステートメント内に適当なケースラベルを含む。変数ｐＩＢａｓｉｃ及びｐＩＤａｔａｂａｓｅは、各々、ＩＢａｓｉｃ及びＩＤａｔａｂａｓｅインターフェイスの仮想ファンクションテーブルのポインタを指す。メソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅは、インターフェイスのポインタが返送されるときにクラスＸＸのオブジェクトに対するレファレンスカウントを増加するためにメソッドＡｄｄＲｅｆ（以下の述べる）を呼び出す。
0004070248.tif 000009
【００１９】
インターフェイスＩＵｎｋｎｏｗｎは、レファレンスカウント動作を実施するのに用いられるメソッドＡｄｄＲｅｆ及びＲｅｌｅａｓｅを定義する。インターフェイスに対する新たなレファレンスが形成されたときには、オブジェクトのレファレンスカウントを増加するためにメソッドＡｄｄＲｅｆが呼び出される。レファレンスがもはや必要でないときには、オブジェクトのレファレンスカウントを減少しそしてレファレンスカウントが０になったときにオブジェクトの割り当てを解除するために、メソッドＲｅｌｅａｓｅが呼び出される。コードテール２は、クラスＩＵｎｋｎｏｗｎを継承するクラスＸＸのメソッドＡｄｄＲｅｆ及びＲｅｌｅａｓｅの典型的な実施に対しＣ＋＋ソースコードのための擬似コードを含んでいる。
【００２０】
ＩＤａｔａｂａｓｅインターフェイス及びＩＢａｓｉｃインターフェイスは、ＩＵｎｋｎｏｗｎインターフェイスを継承する。次の定義は、ＩＵｎｋｎｏｗｎインターフェイスの使用を示すものである。
0004070248.tif 000010
【００２１】
次の擬似コードは、スプレッドシートオブジェクトがＩＤａｔａｂａｓｅインターフェイスをサポートするかどうかを決定するためにワードプロセスプログラムがＩＵｎｋｎｏｗｎインターフェイスをいかに使用するかを示している。
if(pSpreadsheet->QueryInterface("IDatabase",&pIDatabase))
//IDatabase supported
else
//IDatabase not supported
ポインタｐＳｐｒｅａｄｓｈｅｅｔは、スプレッドシートクラスのインスタンスを指すポインタである。上記したように、スプレッドシートオブジェクトは、あるインターフェイスを含み、他は含まない。オブジェクトがＩＤａｔａｂａｓｅインターフェイスをサポートする場合には、メソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅは、ＩＤａｔａｂａｓｅデータ構造を指すようにポインタｐＩＤａｔａｂａｓｅをセットし、そして真をその値として返送する。
【００２２】
図２は、スプレッドシートオブジェクトの記号表示である。以下の説明において、オブジェクトデータ構造は、オブジェクトをアクセスするところのインターフェイスがラベル表示された形状２０１によって表される。
【００２３】
【発明が解決しようとする課題】
本発明の目的は、オブジェクト接続を動的に発生するための方法及びシステムを提供することである。
【００２４】
本発明の別の目的は、その後の通知目的のために任意のインターフェイスを接続するための方法及びシステムを提供することである。
【００２５】
本発明の別の目的は、多数の通知ルーチンに接続する多数の接続ポイントを提供することである。
【００２６】
本発明の更に別の目的は、オブジェクトが接続のための特定のインターフェイスを有するかどうかを判断する機構を提供することである。
【００２７】
本発明の更に別の目的は、どんなタスクを実行するか知ることなく既に接続された通知ルーチンを呼び出すための方法及びシステムを提供することである。
【００２８】
本発明の更に別の目的は、アプリケーションとは独立したオブジェクトインターフェイスを用いて事象を取り扱うための方法及びシステムを提供することである。
【００２９】
【課題を解決するための手段】
上記及び他の目的は、以下の説明から明らかとなるように、オブジェクト接続を動的に発生する改良された方法及びシステムによって達成される。好ましい実施例において、本発明は、ソースオブジェクトとシンクオブジェクトとを備えている。ソースオブジェクトは、１つ以上の接続ポイントオブジェクトを含み、その各々は、シンクオブジェクトに接続するための接続ポイントインターフェイスを含んでいる。各シンクオブジェクトは、シンクオブジェクトに通信するための通知インターフェイスを有している。接続を確立するために、ソースオブジェクトは、特定の接続要求に対してどの接続ポイントオブジェクトを使用するかを決定する。この決定された接続ポイントオブジェクトを用いて、シンクオブジェクトは、ソースオブジェクトに接続されるように要求し、更に通信を行うために使用されるべき通知インターフェイスの指示を渡す。次いで、ソースオブジェクトは、その指示された通知インターフェイスを、接続ポイントオブジェクトによってマネージされるデータ構造に記憶する。その後、ソースオブジェクトは、どんな通知インターフェイスが特定の接続ポイントオブジェクトに記憶されているかを決定し、そして通知インターフェイスを接続した各シンクオブジェクトを通知するために各記憶された通知インターフェイスの特定のメソッドを呼び出す。このような通知は、典型的に、事象、例えば、ユーザ入力装置からの動きに応答して行われる。
【００３０】
【実施例】
本発明は、ソースオブジェクトとシンクオブジェクトとの間のオブジェクト接続を発生するための方法及びシステムを提供する。これらの接続は、オブジェクトに対する多数の形式の事象取扱機構をサポートするのに使用でき、本発明は、オブジェクト通信のための基礎的な接続機構アーキテクチャを提供するものである。ソースオブジェクトは、事象を引き起こすか又は認識するオブジェクトを指し、シンクオブジェクトは、事象を取り扱うオブジェクトを指す。ソースオブジェクトとシンクオブジェクトとの間の接続は、いずれかのオブジェクトによって直接開始されてもよいし、或いはイニシエータ（開始）オブジェクトと称する第３のオブジェクトによって開始されてもよい。典型的な事象取扱環境では、ソースオブジェクトは事象を引き起こすか又は認識し、通知メソッドを呼び出すことによってシンクオブジェクト又はイニシエータオブジェクトに通知する。通知メソッドがイニシエータオブジェクトに属する場合には、イニシエータオブジェクトがその事象を取り扱うためにシンクオブジェクトの適当なメソッドを呼び出すという役目を果たす。
【００３１】
好ましい実施例においては、本発明の方法及びシステムは、中央処理ユニットと、メモリと、入力／出力装置とを備えたコンピュータシステムにおいて実施される。本発明の好ましい実施例において、ソースオブジェクトは、接続ポイントオブジェクトと、これら接続ポイントオブジェクトをマネージするための接続ポイントコンテナオブジェクトとを備えている。好ましくは、接続ポイントコンテナオブジェクトは、ソースオブジェクトの一部分として実施され、そして接続ポイントオブジェクトは、ソースオブジェクトのサブオブジェクトとして実施される。これらサブオブジェクトは、本発明のアプリケーションとは独立した振る舞いを分離する。接続ポイントコンテナオブジェクトは、その収容された接続ポイントオブジェクトを列挙することのできるメソッドと、特定のインターフェイス識別子（ＩＤ）に対応する接続ポイントオブジェクトを見つけられるようにするメソッドとを備えたインターフェイスを形成する。接続ポイントオブジェクトには、ある形式のインターフェイス（インターフェイスＩＤで識別された）が関連され、該インターフェイスを通して、接続されるシンクオブジェクトに通知を出すようにされる。接続ポイントオブジェクトは、通知インターフェイスを接続したり、既に接続された通知インターフェイスを切断したり、接続された通知インターフェイスを列挙したりするメソッドを備えたインターフェイスを形成するのが好ましい。又、接続ポイントオブジェクトは、多数の通知インターフェイス（１つ以上のシンクオブジェクトに属する）に対するレファレンスを任意に記憶できるのが好ましい。接続された通知インターフェイスは、事象セットとして働く。即ち、インターフェイスの定義により、文書インターフェイスをサポートする各オブジェクトは、ある１組のメソッドを与えねばならない。従って、シンクオブジェクトが通知インターフェイスを接続するときには、ソースオブジェクトは、通知インターフェイスによってどんなメソッドがサポートされるか自動的に分かる。このパースペクティブから、サポートされるメソッドは事象におおよそ対応し、そして通知インターフェイス全体は、１組の事象におおよそ対応する。
【００３２】
いったん接続されると、ソースオブジェクトは、接続ポイントオブジェクトを種々のやり方で使用することができる。典型的な動作においては、ソースオブジェクトは、事象通知を受け取ると、その受け取った事象に対応するインターフェイスＩＤに関連した接続ポイントオブジェクト（１つ又は複数）に、接続された通知インターフェイスを得るように相談する。次いで、ソースオブジェクトは、通知インターフェイスの所定のメソッドを呼び出すことにより、各接続された通知インターフェイスに事象通知を送る。このように、単一の事象の発生時に多数のシンクオブジェクトに通知することができる。
【００３３】
図３は、好ましい接続機構のアーキテクチャのブロック図である。この図は、２つの接続ポイントオブジェクト３０５及び３０６を経て２つのシンクオブジェクト３０２及び３０３に接続されたソースオブジェクト３０１を示している。このソースオブジェクト３０１は、接続ポイントオブジェクト３０５及び３０６をマネージするための接続ポイントコンテナオブジェクト３０４を実施する。この接続ポイントコンテナオブジェクト３０４は、接続ポイントオブジェクトを列挙し見つけるためのＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイス３０７を実施する。接続ポイントオブジェクト３０５及び３０６は、接続ポイントコンテナオブジェクト３０４により、それらの各ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイス３０８及び３０９を経てアクセスされる。接続ポイントオブジェクト３０５及び３０６は、それらの各通知インターフェイス３１０及び３１１を経てシンクオブジェクト３０２及び３０３に接続される。ソースオブジェクト３０１は、事象に対応するＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスを位置決めしそしてシンクオブジェクトの通知インターフェイスのメソッドを呼び出すことにより事象の発生をシンクオブジェクト３０２及び３０３に通知する。
【００３４】
上記したように、ソースオブジェクトとシンクオブジェクトとの間の接続は、イニシエータオブジェクトによって開始することができる。イニシエータオブジェクトは、シンクオブジェクトの通知インターフェイスをソースオブジェクトに接続することができ、又はそれ自身の「委託(delegate)」オブジェクトの通知インターフェイスを接続することができる。委託オブジェクトとは、単にシンクオブジェクトとソースオブジェクトとの間にあるオブジェクトである。委託オブジェクトは、ソース及びシンクの両オブジェクトに透過的である。というのは、シンクオブジェクトが与えるような接続ポイントオブジェクトに対応するインターフェイスを実施するからである。委託オブジェクトは、事象通知をシンクオブジェクトに送るという役目を果たす。このように、委託オブジェクトは、ソース及びシンクオブジェクトの比較許可特権に基づいて事象通知を送るかどうかを判断する機密機構として使用できる。
【００３５】
図４は、ソースオブジェクトと、委託オブジェクトと、シンクオブジェクトとの間の接続を示すブロック図である。図４に示された接続は、３つのオブジェクト、即ち接続ポイントオブジェクト４０１、委託オブジェクト４０２及びシンクオブジェクト４０３を備えている。委託オブジェクト４０２は、特定の通知インターフェイス４０４を経て接続ポイントオブジェクト４０１に接続される。この同じ通知インターフェイスは、シンクオブジェクト４０３を委託オブジェクト４０２に接続するのに使用される。従って、２つの通知インターフェイス４０４及び４０５は、同じインターフェイス定義の異なる実施であり、従って、同じインターフェイスＩＤを有する。
【００３６】
本発明の典型的な用途は、ビジュアル（視覚的）プログラミング環境においてオブジェクトを接続することである。ビジュアルプログラミングとは、ビジュアル指向のプログラム（ビジュアルプログラム）を迅速に開発できるようにするコンピュータプログラミング技術である。ビジュアルプログラミング環境は、典型的に、ビジュアルプログラムを形成するように相互接続することのできる予め定義されたコンポーネント（オブジェクト）のリストを含んでいる。各コンポーネントは、入力及び出力ポートと、ビジュアルインターフェイスとを含む。ビジュアルプログラムを形成するときには、ビジュアルプログラマがビジュアルコンポーネント及びディスプレイにおけるそれらの位置を指定する。又、ビジュアルプログラマは種々のポート間の相互接続も指定する。次いで、ビジュアルコンポーネントは、これらの接続を用いて互いに通信する。
【００３７】
例えば、ビジュアルプログラミング環境を用いてアプリケーションプログラムのためのダイアログボックスを形成することができる。図５は、アプリケーションプログラムに対するオープンファイルダイアログボックスを形成するのに使用されるビジュアルプログラミング環境ディスプレイのブロック図である。オープンファイルダイアログボックスは、オープンすべきファイルを選択するためにファイル名のリストを通してスクロールするのに使用される。ビジュアルプログラミング環境のディスプレイは、２つの部分、即ちワークスペースディスプレイエリア５０１と、コマンドエリア５０２とを備えている。ワークスペースディスプレイエリア５０１は、多数のオブジェクトが形成されて、ダイアログボックスをビジュアルにプログラムするよう接続されることを示している。ワークスペースディスプレイエリア５０１に現在示されているオブジェクトは、オープンファイルダイアログボックスオブジェクト５０３と、４つのコードオブジェクト５０４ないし５０７とを備えている。各オブジェクトは、次いで、多数のサブオブジェクトを備えている。例えば、オープンファイルダイアログボックスオブジェクト５０３は、タイトルバーオブジェクト５０８、多選択リストボックスオブジェクト５０９、及びボタンオブジェクト５１０を備えている。図示された状態では、多選択リストボックスオブジェクト５０９は、他のオブジェクトとの接続を形成するようにユーザによって現在選択されている。選択されたオブジェクト５０９に対応する入力ポート５１１及び出力ポート５１２は、ハイライト状態のオブジェクトとして示されている。コマンドエリア５０２のボタンによって与えられる種々のコマンドを用いて、ビジュアルプログラマは、オープンファイルダイアログボックスオブジェクト５０３の出力ポート５１６、多選択リストボックスオブジェクト５０９の入力及び出力ポート５１１及び５１２、並びにボタンオブジェクト５１０の入力及び出力ポート５１３及び５１４をコードオブジェクト５０４ないし５０６に接続している。特に、オープンファイルダイアログボックスオブジェクト５０３の出力ポート５１６は、コードオブジェクト５０４の入力ポート５１７に接続されており、このコードオブジェクトは、多選択リストボックスオブジェクト５０９に示されたファイルのリストを更新するためのコードを含んでいる。又、多選択リストボックスオブジェクト５０９の入力ポート５１１は、コードオブジェクト５０４の出力ポート５１８に接続されている。それ故、ユーザがオープンファイルダイアログボックスオブジェクト５０３を選択したときは、多選択リストボックスオブジェクト５０９に示されたファイルのリストが、上記ダイアログボックスが最後に選択されたとき以来のファイルの追加又は削除を表すように更新される。多選択リストボックスオブジェクト５０９の出力ポート５１２は、コードオブジェクト５０５の入力ポート５１９に接続されており、このコードオブジェクトは、多選択リストボックスオブジェクト５０９において選択されたファイルを追跡するためのコードを含んでいる。この出力ポートは、コードオブジェクト５０４の入力ポート５１７にも接続されており、ユーザがファイルを選択するたびに、多選択リストボックスに表示されるファイルリストが更新されるようになっている。ボタンオブジェクト５１０の入力ポート５１３は、コードオブジェクト５０５の出力ポート５２０に接続されており、従って、選択されたファイルのリストは、ファイルが選択されるたびにボタンオブジェクト５１０に通される。ボタンオブジェクト５１０の出力ポート５１４は、コードオブジェクト５０６の入力ポート５２１に接続されており、該コードオブジェクトは、ボタンオブジェクト５１０により実施されるＯＫボタンをユーザが押したときに選択されたファイルのリストにおける各ファイルをオープンするコードを含んでいる。
【００３８】
このビジュアルプログラミング環境を用いていったん形成すると、オープンファイルダイアログボックスは、特定のシステム事象、例えば、ユーザ入力装置から生じた事象に応答することによって動作する。例えば、ユーザがオープンファイルダイアログボックス５０３を選択したときには、ＭｏｕｓｅＬｅｆｔＢｕｔｔｏｎＤｏｗｎ選択事象がオープンファイルダイアログボックスオブジェクト５０３へ送られる。この選択事象を受け取ると、オープンファイルダイアログボックスオブジェクト５０３は、コードオブジェクト５０４に通知を送る。というのは、コードオブジェクト５０４の入力ポート５１７がオープンファイルダイアログボックスオブジェクト５０３の出力ポート５１６に既に接続されているからである。表示されたファイルのリストを更新するためのコードを実施するコードオブジェクト５０４は、次いで、更新されたファイルリストを多選択リストボックスオブジェクト５０９へ送る。というのは、コードオブジェクト５０４の出力ポート５１８が多選択リストボックスオブジェクト５０９の入力ポート５１１に既に接続されているからである。又、ユーザがマウス入力装置を用いて多選択リストボックスオブジェクト５０９により実施されるリストボックスのファイルを選択するときには、ＭｏｕｓｅＬｅｆｔＢｕｔｔｏｎＤｏｗｎ選択事象が多選択リストボックスオブジェクト５０９に送られる。この事象は、次いで、ユーザ選択を追跡するためにコードオブジェクト５０５へ送られる。というのは、コードオブジェクト５０５の入力ポート５１９が多選択リストボックスオブジェクト５０９の出力ポート５１２に既に接続されているからである。コードオブジェクト５０５は、次いで、選択されたファイルのリストをボタンオブジェクト５１０に送る。というのは、コードオブジェクト５０５の出力ポート５２０がボタンオブジェクト５１０の入力ポート５１３に既に接続されているからである。更に、ユーザがボタンオブジェクト５１０により実施されているＯＫボタンを選択するときには、システム選択事象（例えば、ＭｏｕｓｅＬｅｆｔＢｕｔｔｏｎＤｏｗｎ選択事象）がボタンオブジェクト５１０へ送られる。このボタンオブジェクト５１０は、その出力（この場合は選択されたファイルのリスト）をコードオブジェクト５０６に送る。というのは、ボタンオブジェクト５１０の出力ポート５１４がコードオブジェクト５０６の入力ポート５２１に既に接続されているからである。このボタン選択事象を受け取ると、コードオブジェクト５０６は、ユーザが選択したファイルを開く。
【００３９】
１つの例示的な用途においては、本発明は、図５に示されたビジュアルプログラミング例で必要とされるオブジェクト接続を動的に発生するのに使用することができる。図６は、本発明を用いて図５に示したオブジェクトを接続した後のオブジェクト接続及びデータ構造のブロック図である。図６は、４つのオブジェクト、即ち図５のオープンファイルダイアログボックスオブジェクト５０３に対応するソースオブジェクト６０１と、図５のコードオブジェクト５０４ないし５０６に対応する３つのシンクオブジェクトとを示している。オープンファイルダイアログボックスオブジェクト５０３に対応するソースオブジェクト６０１は、タイトルバーオブジェクト５０８、多選択リストボックスオブジェクト５０９及びボタンオブジェクト５１０に対応するサブオブジェクトを含んでいる（これらのサブオブジェクトはいずれも示されていない）。或いは又、本発明を用いて、オープンファイルダイアログボックスオブジェクト５０３に含まれたサブオブジェクトの各々に対するソースオブジェクトを形成しそしてその各々のソースオブジェクトを適当なコードオブジェクト（シンクオブジェクト）に接続することもできる。
【００４０】
オープンファイルダイアログボックスオブジェクト５０３は、オープンファイルダイアログボックスオブジェクト５０３の選択、多選択リストボックスオブジェクト５０９内のファイルの選択、及びボタンオブジェクト５１０により実施されるＯＫボタンのユーザ選択に対応するシステム事象を取り扱うので、ソースオブジェクト６０１は、異なる事象セットに関連した接続ポイントオブジェクトをサポートする。より詳細には、ソースオブジェクト６０１は、接続ポイントコンテナオブジェクト６０５と、３つの接続ポイントオブジェクト６０８、６１２及び６１５とを含んでいる。接続ポイントオブジェクト６０８には、多選択リストボックスオブジェクト５０９をサポートするのに使用されるＩＭｕｌｔｉｐｌｅＬｉｓｔインターフェイスが関連される。接続ポイントオブジェクト６１２にはボタンオブジェクト５１０をサポートするのに使用されるＩＢｕｔｔｏｎインターフェイスが関連される。接続ポイントオブジェクト６１５には、オープンファイルダイアログボックスオブジェクト５０３をサポートするのに使用されるＩＤｉａｌｏｇインターフェイスが関連される。接続ポイントコンテナオブジェクト６０５は、ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスを形成し、接続ポイントオブジェクトのポインタのリストを維持する。図６において、接続ポイントオブジェクトを指すポインタのリストは、現在、３つのエレメント６０６、６０７及び６１８を有している。各エレメントは、接続ポイントオブジェクトに関連したインターフェイスＩＤのインジケータと、接続ポイントオブジェクトのＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスのポインタと、リストの次のエレメントのポインタとを含んでいる。形成された接続ポイントオブジェクトのセットをマネージするのに他のデータ構造を使用できることが当業者に明らかであろう。又、効率の理由で、各リストエレメントに関連される情報はもっと多くてもよいし少なくてもよい。例えば、各エレメントがインターフェイスＩＤを記憶する必要はない。というのは、インターフェイスＩＤは接続ポイントオブジェクトから容易にアクセスできるからである。
【００４１】
各接続ポイントオブジェクトは、ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスを形成し、そしてシンクオブジェクトに属する通知インターフェイスに対するレファレンスのリストを維持する。シンクオブジェクトの通知インターフェイスに対するレファレンスは、シンクオブジェクトがＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスを用いて接続ポイントオブジェクトから接続を要求するときにこのリストに加えられる。接続ポイントコンテナオブジェクト６０５のリストエレメント６０６によってレファレンスされる接続ポイントオブジェクト６０８は、現在、２つのエレメント６１０及び６１１を含む通知インターフェイスに対するレファレンスのリストを示す。通知インターフェイス６０９に対するレファレンスのリストのヘッダは、それに関連したインターフェイス識別子及び第１リストエレメントを迅速にアクセスするために設けられている。各リストエレメントは、接続を独特に識別するトークンと、接続されたシンクオブジェクトのＩＵｎｋｎｏｗｎインターフェイスのポインタと、リスト内の次のエレメントのポインタとを含んでいる。例えば、リストエレメント６１０は、シンクオブジェクト６０２との接続を独特に識別するトークンを含み、このシンクオブジェクトは、多選択リストボックスオブジェクト５０９により表示されたファイルのリストを更新するためのコードオブジェクト５０４に対応する。又、リストエレメント６１０は、シンクオブジェクト６０２のＩＭｕｌｔｉｐｌｅＬｉｓｔインターフェイス（通知インターフェイス）をアクセスするためにシンクオブジェクト６０２のＩＵｎｋｎｏｗｎインターフェイスのポインタを含んでいる。又、リストエレメント６１０は、リストエレメント６１１のポインタを与える。リストエレメント６１１は、選択されたファイルを追跡するためにコードオブジェクト５０５に対応するシンクオブジェクト６０３に同様に接続される。
【００４２】
接続ポイントオブジェクト６１２は、ボタンオブジェクト５１０とシンクオブジェクト６０４との間の接続を実施し、このシンクオブジェクトは、ユーザが選択したファイルをオープンするためのコードオブジェクト５０６に対応する。接続ポイントオブジェクト６０８と同様に、接続ポイントオブジェクト６１２は、１つのエレメント６１４をもつリストを含んでいる。エレメント６１４は、コードオブジェクト５０６に対応するシンクオブジェクト６０４のＩＵｎｋｎｏｗｎインターフェイスを指すポインタを含んでいる。更に、接続ポイントオブジェクト６１５は、シンクオブジェクト６０２の通知インターフェイスに同様に接続される。接続ポイントオブジェクト６１５（ＩＤｉａｌｏｇ）に接続されたシンクオブジェクト６０２の通知インターフェイスは、接続ポイントオブジェクト６０８に接続された同じシンクオブジェクト（ＩＭｕｌｔｉｐｌｅＬｉｓｔ）の通知インターフェイスとは異なることに注意されたい。しかしながら、この実施例では、両接続ポイントオブジェクト６０８及び６１５は、シンクオブジェクト６０２のＩＵｎｋｎｏｗｎインターフェイスを指すポインタを含んでいる。図６に示すように、接続ポイントオブジェクトは、１つ以上の通知インターフェイス（１つ以上のシンクオブジェクトの）に接続することができ、そしてシンクオブジェクトは、１つ以上の接続ポイントオブジェクトに接続することができる。
【００４３】
図６を参照すれば、ソースオブジェクト６０１がオープンファイルダイアログボックス５０３に関連した事象を受け取るとき、ソースオブジェクト６０１は、ＩＤｉａｌｏｇインターフェイス（６１５）に対応する接続ポイントオブジェクトを見つける。ソースオブジェクト６０１は、シンクオブジェクト６０２に通知を出し、該シンクオブジェクト６０２は、そのＩＤｉａｌｏｇインターフェイスを用いてファイルのリストを更新する。ソースオブジェクト６０１は、多選択リストボックスオブジェクト５０９を選択することに関連した選択事象を受け取ると、ＩＭｕｌｔｉｐｌｅＬｉｓｔインターフェイス（６０８）に対応する接続ポイントオブジェクトを見つけ、そしてそれらの接続された通知インターフェイス（ＩＭｕｌｔｉｐｌｅＬｉｓｔ）を用いてシンクオブジェクト６０２及び６０３に通知する。同様に、ソースオブジェクト６０１は、ユーザがボタンオブジェクト５１０を押すことに関連した選択事象を受け取ると、ＩＢｕｔｔｏｎインターフェイス（６１２）に対応する接続ポイントオブジェクトを見つけ、接続された通知インターフェイス（ＩＢｕｔｔｏｎ）を用いてシンクオブジェクト６０４に通知する。ボタンオブジェクト５１０を選択することに対応する事象通知の例を図９を参照して説明する。
0004070248.tif 000011
【００４４】
コードテーブル３は、インターフェイスＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔ及びＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎｓの好ましい定義と、列挙インターフェイスＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎｓにより返送されるデータ構造とに対するＣ＋＋擬似コードを含んでいる。ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎインターフェイスは、接続ポイントオブジェクトを接続及び切断しそしてその接続ポイントオブジェクトに接続された通知インターフェイスを列挙するためのメソッドを含んでいる。メソッドＧｅｔＣｏｎｎｅｃｔｉｏｎＩｎｔｅｒｆａｃｅは、接続ポイントオブジェクトに関連したインターフェイスＩＤのポインタを返送する。メソッドＧｅｔＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒは、接続ポイントオブジェクトを含む接続ポイントコンテナオブジェクト（その親コンテナオブジェクト）のＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスを指すポインタを返送する。接続ポイントオブジェクトがインスタンス生成されるときは、接続ポイントオブジェクトの形成メソッドが、将来の使用のために接続ポイントコンテナオブジェクトを指すポインタを渡す。メソッドＡｄｖｉｓｅは、パラメータｐｕｎｋにより指定された通知インターフェイスを接続ポイントオブジェクトに接続し、もし首尾良くいった場合は、パラメータｐｄｗＴｏｋｅｎにおける接続を識別する独特のトークンを返送する。この独特のトークンは、永久に記憶される。メソッドＵｎａｄｖｉｓｅは、入力パラメータｄｗＴｏｋｅｎによって指定された通知インターフェイスを切断する。メソッドＥｎｕｍＣｏｎｎｅｃｔｉｏｎｓは、インターフェイスＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎｓのインスタンスである列挙インターフェイスを、接続された通知インターフェイスを経て繰り返し返送する。
【００４５】
インターフェイスＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎｓは、ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスにより使用されるエニュメレータを実施する。このエニュメレータは、特定の接続ポイントオブジェクトに対して通知インターフェイス接続を列挙する１組のメソッドを含んでいる。問題とする２つのメソッドは、第１の接続された通知インターフェイスを指すようにエニュメレータを再初期化するメソッドＲｅｓｅｔと、次の接続された通知インターフェイスのポインタを返送するメソッドＮｅｘｔとを含む。コードテーブル３は、列挙メソッドＮｅｘｔにより返送される接続情報、ＣＯＮＮＥＣＴＤＡＴＡと称する、に対する典型的な構造定義を示している。
0004070248.tif 000012
【００４６】
コードテーブル４は、インターフェイスＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒ及びＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔｓの好ましい定義に対するＣ＋＋擬似コードを含んでいる。ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスは、特定の接続ポイントオブジェクトを見つけそして１組の収容された接続ポイントオブジェクトを列挙するための方法を実施する。ＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔｓインターフェイスはＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスにより使用される列挙メソッドを実施する。ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスは、指定のインターフェイスＩＤを与えたＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスのポインタを返送するメソッドＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔを含んでいる。メソッドＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔｓは、収容された１組の接続ポイントオブジェクトを経てインターフェイスＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔｓのポインタを繰り返し返送する。インターフェイスＩＥｎｕｍＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔｓは、第１の接続オブジェクトを指すようにエニュメレータを初期化するメソッドＲｅｓｅｔと、接続ポイントコンテナオブジェクトに記憶された次の接続ポイントオブジェクトに関連したＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスを指すポインタを検索するメソッドＮｅｘｔとを備えている。
【００４７】
図５及び６について説明した例と対応的に、図５に示されたビジュアルプログラミング環境より成るオブジェクトは、オープンファイルダイアログボックスオブジェクト５０３（ソースオブジェクト）とコードオブジェクト（シンクオブジェクト）５０４、５０５及び５０６との間の接続を設定するイニシエータオブジェクトとして働く。図７は、指定のシンクオブジェクトを指定の通知インターフェイスに対する指定のソースオブジェクトに接続するためのファンクションＳｅｔＵｐＣｏｎｎｅｃｔｉｏｎの流れ線図である。イニシエータオブジェクト（ビジュアルプログラミング環境を実施するコード）は、このファンクションを使用して、図５及び６に示された全ての接続を設定することができる。ファンクションＳｅｔＵｐＣｏｎｎｅｃｔｉｏｎは、コードテーブル３及び４に示されたインターフェイスを使用して事象取扱機構を設定するための一例を与える。これらのインターフェイス、及びＳｅｔＵｐＣｏｎｎｅｃｔｉｏｎとは異なるファンクションが多数使用できることが当業者に明らかであろう。
【００４８】
ファンクションＳｅｔＵｐＣｏｎｎｅｃｔｉｏｎは、ソースオブジェクトにおける接続ポイントオブジェクトを接続のために決定し、そしてシンクオブジェクトの適当な通知インターフェイスを接続ポイントオブジェクトに接続する。このファンクションは、３つの入力パラメータをとる。即ち、接続すべきソースオブジェクトのあるインターフェイスを指すポインタであるｐＳｒｃと、接続すべきシンクオブジェクトのあるインターフェイスを指すポインタであるｐＳｉｎｋと、シンクオブジェクトが接続しようとする接続ポイントオブジェクトに関連したインターフェイス識別子であるｉｉｄである。ステップ７０１において、このファンクションは、指定のソースオブジェクトのメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅを呼び出して、指定のソースオブジェクトのＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスを位置決めする。ステップ７０２において、ファンクションは、返送されたＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスポインタを使用して、メソッドＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔを呼び出し、指定のｉｉｄに対する接続ポイントオブジェクトのポインタを検索する。（このファンクションは、図８を参照して説明する。）ステップ７０３において、ファンクションは、例えば、将来にシンクオブジェクトの切断に使用するために、接続ポイントオブジェクトの返送されたポインタをセーブする。ステップ７０４において、ファンクションは、指定のシンクオブジェクトのメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅを呼び出して、シンクオブジェクトのＩＵｎｋｎｏｗｎインターフェイスのポインタを得る。ステップ７０５において、ファンクションは、接続ポイントオブジェクト（ステップ７０２で返送された）のメソッドＡｄｖｉｓｅを呼び出し、シンクオブジェクトのＩＵｎｋｎｏｗｎインターフェイスを接続ポイントオブジェクトに接続する。ファンクションは、Ａｄｖｉｓｅの呼び出しにおいてシンクオブジェクトのＩＵｎｋｎｏｗｎインターフェイスのポインタを渡し、それが首尾良くいく場合は、メソッドＡｄｖｉｓｅは、接続された通知インターフェイスを独特に識別するトークンを返送する。ステップ７０６において、メソッドＡｄｖｉｓｅによって接続が首尾良く実行された場合には、ファンクションはステップ７０７に続き、さもなくば、エラーを返送する。ステップ７０７において、ファンクションは、シンクオブジェクトの通知インターフェイスの切断に後で使用するためにメソッドＡｄｖｉｓｅによって返送されたトークンをセーブし、そして復帰となる。
【００４９】
ファンクションＳｅｔＵｐＣｏｎｎｅｃｔｉｏｎは、接続ポイントオブジェクトとシンクオブジェクトとの間の接続を設定する１つのメソッドを組み込んでいる。多数の別の方法があることが当業者に明らかであろう。例えば、ステップ７０２とは別に、ＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスの列挙メソッドＥｎｕｍＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔｓを用いて、接続ポイントオブジェクトを決定してもよい。又、シンク又はイニシエータオブジェクトがソースオブジェクトにおける接続ポイントオブジェクトのポインタを既に有している場合には、シンク又はイニシエータオブジェクトはＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスのメソッドＧｅｔＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒを用いて、接続ポイントコンテナオブジェクトのポインタを検索し、異なる接続ポイントオブジェクトをサーチすることができる。又、シンク又はイニシエータオブジェクトが所望の接続ポイントオブジェクトを既に得ている場合には、シンク又はイニシエータオブジェクトはメソッドＡｄｖｉｓｅを直接呼び出し、予備的なステップを省くことができる。更に、好ましい実施例では、指定のシンクオブジェクトのＩＵｎｋｎｏｗｎインターフェイスのポインタは、指定の接続ポイントオブジェクトに記憶されたインターフェイスポインタであると仮定する。ＩＵｎｋｎｏｗｎインターフェイスは、接続ポイントオブジェクトの永続的記憶をサポートし、そして接続されたシンク又は委託オブジェクトへの遅延結合をイネーブルするのに使用される。或いは又、遅延結合に関連することなく通知インターフェイス自体のポインタを記憶することもできる。又、このファンクション及び以下に述べるファンクションでは、説明の簡略化のために、レファレンスカウントが省略されていることに注意されたい。オブジェクト接続が形成されそして破壊されるときには、好ましくはレファレンスカウントが更新されそして好ましくは繰り返しレファレンスが回避されることが当業者に明らかであろう。
【００５０】
図８は、ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスのメソッドＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔを示すフローチャートである。このメソッドは、指定のインターフェイス識別子に対応する接続ポイントオブジェクトのＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスのポインタを返送する。指定のインターフェイス識別子は、入力パラメータとしてこのメソッドに通され、そしてこのメソッドは、出力パラメータにおけるインターフェイスポインタを指すポインタを返送する。ステップ８０１ないし８０６では、このメソッドは、インスタンス生成された接続ポイントオブジェクトのリストを通してループし、指定のインターフェイス識別子に対応する接続ポイントオブジェクトを探す。ステップ８０７ないし８１０において、対応する接続ポイントオブジェクトが見つからない場合には、このメソッドは、要求されたインターフェイス識別子がソースオブジェクトによってサポートされる場合に新たな接続ポイントオブジェクトをインスタンス生成し、さもなくば、このメソッドは、エラーを返送する。ステップ８０１において、第１のリストエレメントに含まれたＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスポインタを指すように一時的な変数がセットされる。ステップ８０２において、一時的な変数によって指されたインターフェイスのメソッドＧｅｔＣｏｎｎｅｃｔｉｏｎＩｎｔｅｒｆａｃｅが呼び出されて、一時的な変数によって参照された接続ポイントオブジェクト（現在接続ポイントオブジェクト）に関連したインターフェイスＩＤが指定のインターフェイスＩＤに一致するかどうかを決定する。ステップ８０３において、返送されたインターフェイスＩＤが指定のインターフェイスＩＤに一致する場合には、このメソッドはステップ８０４に続き、さもなくば、ステップ８０５に続く。ステップ８０４では、このメソッドは、一時的な変数により参照されたＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスポインタのアドレスを指すように出力パラメータをセットし、そして復帰する。ステップ８０５において、一時的な変数（現在接続ポイントオブジェクトを指す）は、インスタンス生成された接続ポイントオブジェクトのリストにおける次のエレメントのＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスを指すようにセットされる。ステップ８０６において、このメソッドがリストの終わりに達した場合には、このメソッドはステップ８０７へ続き、さもなくば、このメソッドは、ステップ８０１においてループの始めへ戻る。ステップ８０７において、このメソッドは、指定のインターフェイスＩＤが、ソースオブジェクトがサポートする接続インターフェイスに対応するかどうかを決定し、もしそうであれば、このメソッドは、ステップ８０８へ続き、さもなくば、エラーを返送する。ステップ８０８において、このメソッドは、新たな接続ポイントオブジェクトをインスタンス生成する。ステップ８０９において、このメソッドは、新たにインスタンス生成された接続ポイントオブジェクトを、接続ポイントオブジェクトの接続ポイントコンテナオブジェクトのリストへ挿入する。ステップ８１０において、このメソッドは、その新たにインスタンス生成された接続ポイントオブジェクトのアドレスを指すように出力パラメータをセットし、そして復帰する。
【００５１】
図８のメソッドＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔを構成するステップは、接続ポイントオブジェクトが必要に応じて動的にインスタンス生成されることを仮定している。接続ポイントオブジェクトは、ソースオブジェクトの実施に基づいて動的に又は静的に確立できることが当業者に明らかであろう。例えば、ソースオブジェクトをインスタンス生成する際には、ソースオブジェクトによってサポートされる各接続インターフェイス識別子に対応する接続ポイントオブジェクトを、通知インターフェイスに対する空のレファレンスリストと共にインスタンス生成することができる。又、接続ポイントオブジェクトの実施構造の知識と共に接続ポイントコンテナオブジェクトが実施される場合には、効率化の理由で、あるステップをメソッドＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔから除去することができる。このような知識は、典型的に、ソースオブジェクトの実施が接続ポイントコンテナオブジェクト及び接続ポイントオブジェクトに対してそれ自身の実施を与える場合に生じる。更に、メソッドＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔは、接続ポイントオブジェクトに対するレファレンスを記憶するのに用いられるデータ構造が図６に示すようなリスト構造であると仮定する。或いは又、このメソッドは、種々の記憶データ構造を取り扱うように書き込むこともできる。
【００５２】
図９は、ソースオブジェクトとシンクオブジェクトとの間に確立された接続を使用する方法のフローチャートである。より詳細には、図９は、ユーザがＯＫボタンオブジェクト５１０を押したことを指示するシステム選択事象をソースオブジェクトが受け取ったときに図５のオープンファイルダイアログボックスオブジェクト５０３に対応するソースオブジェクトによって実行することのできる１組のステップを示している。この例は、図６を参照して述べたように接続が適当に確立されたと仮定している。オブジェクト接続機構の意味及び他の多数の使用が考えられることが当業者に明らかであろう。
【００５３】
ユーザが図５のＯＫボタンオブジェクト５１０を押すと、システムは選択事象をソースオブジェクトに送信する。次いで、ソースオブジェクトは、外部で生じた事象に応答するためにある内部ルーチンを呼び出す。図９は、このようなルーチン、即ちＩＤｉａｌｏｇＢｏｘインターフェイスに対するメソッドＯＫ ＢｕｔｔｏｎＤｏｗｎの例を示している。メソッドＯＫ ＢｕｔｔｏｎＤｏｗｎは、生じた事象に関連するインターフェイス識別子にどの接続ポイントオブジェクトが対応するかを決定し、そしてその決定された接続ポイントオブジェクトに接続された通知インターフェイスの所定のメソッドを呼び出す。既に述べたように、生じた事象を含む１組の事象はインターフェイスによって表されるので、ソースオブジェクトは、接続されたシンクオブジェクトによりどんなメソッドがサポートされるかの知識を有する。更に、生じた事象を取り扱うソースオブジェクトルーチン（この場合は、ＯＫ ＢｕｔｔｏｎＤｏｗｎメソッド）では、ソースオブジェクトは、その生じた事象を取り扱うためにシンクオブジェクトのどの特定メソッドを呼び出すのが好ましいかを判断することができる。この特定例では、このメソッドは、その生じた選択事象に応答するために、インターフェイス識別子ＩＩＤ ＩＢｕｔｔｏｎに対応する通知インターフェイスのメソッドＭｏｕｓｅＬｅｆｔＢｕｔｔｏｎＤｏｗｎを呼び出すのが好ましいと決定する。
【００５４】
ステップ９０１では、このメソッドは、メソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅを用いてそれ自身のＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスを得る。ステップ９０２では、このメソッドは、ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスポインタを用いて、メソッドＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔを呼び出し、インターフェイス識別子ＩＩＤ ＩＢｕｔｔｏｎに対応する接続ポイントオブジェクトを要求する。ステップ９０３では、このメソッドは、手前のステップで返送された接続ポイントオブジェクトのメソッドＥｎｕｍＣｏｎｎｅｃｔｉｏｎｓを呼び出して、接続ポイントオブジェクトの内容を列挙するエニュメレータを得る。ステップ９０４では、このメソッドは、通知インターフェイスのレファレンスのリストの始めでスタートするようにエニュメレータをリセットする。ステップ９０５では、このメソッドは、エニュメレータのメソッドＮｅｘｔを呼び出し、次にレファレンスされた通知インターフェイスに対する接続データを得る。ステップ９０６では、通知インターフェイスに対するそれ以上のレファレンスが存在しないことをエニュメレータが指示する場合には、このメソッドは復帰となり、さもなくば、このメソッドはステップ９０７へ続く。ステップ９０７では、このメソッドは、もし必要ならばリモート手順コールを用いて、接続ポイントデータ構造で指示されたＩＵｎｋｎｏｗｎインターフェイスのメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅを呼び出し、インターフェイス識別子ＩＩＤ ＩＢｕｔｔｏｎに対応する通知インターフェイスを要求する。リモート手順コールは、接続された通知インターフェイスが別のプロセスアドレススペース内に含まれたオブジェクトに属する場合に必要とされる。ステップ９０８において、このメソッドは、検索されたＩＢｕｔｔｏｎインターフェイスのメソッドＭｏｕｓｅＬｅｆｔＢｕｔｔｏｎＤｏｗｎを呼び出し（もし必要ならばリモート手順コールを用いて）、そしてステップ９０５のループの始めへと戻る。接続ポイントコンテナオブジェクト及び接続ポイントオブジェクトの実施がソースオブジェクトの実施によって分かる場合には、効率化の理由で、この方法の多数のステップを省略できることが当業者に明らかであろう。
【００５５】
図１０は、指定の通知インターフェイスを切断するためにシンクオブジェクトによって定められたファンクションのフローチャートである。このファンクションは、シンクオブジェクトが切断しようとする通知インターフェイスのインターフェイスＩＤである１つの入力パラメータを有している。ステップ１００１において、このファンクションは、ファンクションＳｅｔＵｐＣｏｎｎｅｃｔｉｏｎの間に既に記憶された（図７のステップ７０３）指定のインターフェイスＩＤに対する接続ポイントオブジェクトのＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスのポインタを検索する。又、このファンクションは、指定のインターフェイスＩＤに対して既に確立された（図７のステップ７０７）接続を独特に識別するトークンも検索する。ステップ１００２において、このファンクションは、検索されたＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスのメソッドＵｎａｄｖｉｓｅを呼び出し、検索されたトークンをこれに渡し、そして復帰する。ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔインターフェイスのメソッドＵｎａｄｖｉｓｅは、指定のトークンを使用して通知インターフェイスに対するレファレンスのリストをサーチし、それに対応する通知インターフェイスレファレンスを見つける。メソッドＵｎａｄｖｉｓｅは、次いで、対応する通知インターフェイスに対するレファレンスを、接続された通知インターフェイスのリストから除去し、従って、対応する通知インターフェイスを切断する。
0004070248.tif 000013
【００５６】
コードテーブル５は、未知のソースオブジェクトに関する情報を得るためにシンクオブジェクトにより使用できるインターフェイスＩＰｒｏｖｉｄｅＣｌａｓｓＩｎｆｏの好ましい定義に対するＣ＋＋擬似コードを含む。ＩＰｒｏｖｉｄｅＣｌａｓｓＩｎｆｏインターフェイスのメソッドＧｅｔＣｌａｓｓＩｎｆｏは、未知のソースオブジェクトからクラス及びタイプ情報を得てそれに接続するためにシンク又はイニシエータオブジェクトによって使用することができる。ＩＴｙｐｅＩｎｆｏインターフェイスは、どんな事象が生じるかそしてどんな特性をサポートするかについてソースオブジェクトにより実施されるインターフェイスを記述する。シンク又はイニシエータオブジェクトは、この情報を用いて、適合し得る接続を設定することができる。ＩＴｙｐｅＩｎｆｏインターフェイスは、参考としてここに取り上げる「タイプライブラリーにインターフェイスするための方法及びシステム(Method and System for Interfacing to a Type Library)」と題する米国特許出願第０７／９５９，０５６号に詳細に説明されている。
【００５７】
以上、好ましい実施例について本発明を説明したが、本発明は、この実施例に限定されるものはない。当業者であれば、本発明の精神内での変更が明らかであろう。従って、本発明は、特許請求の範囲のみにより限定されるものとする。
【図面の簡単な説明】
【図１】オブジェクトを表すのに使用される典型的なデータ構造を示すブロック図である。
【図２】スプレッドシートオブジェクトの記号表示である。
【図３】好ましい接続機構アーキテクチャのブロック図である。
【図４】ソースオブジェクト、委託オブジェクト及びシンクオブジェクトの間の接続を示すブロック図である。
【図５】アプリケーションプログラムのためのオープンファイルダイアログボックスを形成するのに使用されるビジュアルプログラミング環境のディスプレイを示すブロック図である。
【図６】本発明を用いて図５に示すオブジェクトを接続した後のオブジェクト接続及びデータ構造を示すブロック図である。
【図７】指定のシンクオブジェクトを指定の通知インターフェイスに対する指定のソースオブジェクトに接続するためのファンクションＳｅｔＵｐＣｏｎｎｅｃｔｉｏｎを示すフローチャートである。
【図８】ＩＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔＣｏｎｔａｉｎｅｒインターフェイスの方法ＦｉｎｄＣｏｎｎｅｃｔｉｏｎＰｏｉｎｔのフローチャートである。
【図９】ソースオブジェクトとシンクオブジェクトとの間に確立された接続を使用する方法のフローチャートである。
【図１０】指定の通知インターフェイスを切断するためにシンクオブジェクトによって定められたファンクションのフローチャートである。
【符号の説明】
３０１  ソースオブジェクト
３０２、３０３  シンクオブジェクト
３０５、３０６  接続ポイントオブジェクト
３０７、３０８、３０９、３１０、３１１  インターフェイス
４０１  接続ポイントオブジェクト
４０２  委託オブジェクト
４０３  シンクオブジェクト
４０４、４０５  通知インターフェイス
【図１】
0004070248.tif 000014
【図２】
0004070248.tif 000015
【図３】
0004070248.tif 000016
【図４】
0004070248.tif 000017
【図５】
0004070248.tif 000018
【図６】
0004070248.tif 000019
【図７】
0004070248.tif 000020
【図８】
0004070248.tif 000021
【図９】
0004070248.tif 000022
【図１０】
0004070248.tif 000023