(57)【特許請求の範囲】
【請求項１】
コンピュータのサーバプロセスからクライエントプロセスへのソフトウエアオブジェクトのインターフェイスにアクセスするプロセッサを有するコンピュータシステムであって、
上記サーバプロセス及び上記クライエントプロセスを維持するメモリを備え、
上記メモリ中の上記クライエントプロセスは、
上記クライエントプロセスの上記メモリ及び上記サーバプロセスの上記メモリの双方に存在する手続きを呼び出すための呼出命令と、
上記手続きの名前及び少なくとも１つのパラメータをメッセージにパッキングするためのパッキング命令と、
対応するサーバスタブオブジェクトに上記メッセージを送信するための送信命令と
を有し、
上記メモリ中の上記サーバプロセスは、
上記サーバスタブオブジェクトで上記クライエントプロセスからの上記メッセージを受け取るための受取命令と、
上記サーバスタブオブジェクトに上記メッセージから上記手続きの名前及び上記少なくとも１つのパラメータをアンマーシャリングさせるためのアンマーシャリング命令と、
上記サーバスタブオブジェクトに上記パラメータを用いて上記手続きを起動させ、上記ソフトウエアオブジェクトの上記インターフェイスのポインタを生成するためのサーバオブジェクト呼出命令と、
上記サーバスタブオブジェクトが上記ソフトウエアオブジェクトの上記インターフェイスの上記ポインタをマーシャリングするようにするためのマーシャリング命令であって、
スタブメッセージアドレス及びアンマーシャリングクラス識別子を有するオブジェクトインターフェイススタブを生成するための生成命令、
上記オブジェクトインターフェイススタブへ上記ソフトウエアオブジェクトの上記インターフェイスの上記ポインタを格納するための格納命令、及び
上記オブジェクトインターフェイススタブに、マーシャリングメッセージを生成させ、上記スタブメッセージアドレス及び上記アンマーシャリングクラス識別子を上記マーシャリングメッセージにパッキングするための生成命令
を有するマーシャリング命令と、
上記クライエントプロセスへ上記マーシャリングメッセージを送信するための送信命令と
を有し、
上記メモリ中の上記クライエントプロセスは、さらに
上記サーバプロセスからの上記マーシャリングメッセージを受け取るためのクライエント受取命令と、
上記サーバプロセスからの上記マーシャリングメッセージをアンマーシャリングするためのクライエントアンマーシャリング命令であって、
受け取った上記マーシャリングメッセージから上記スタブメッセージアドレス及び上記アンマーシャリングクラス識別子を検索ためのクライエントアンマーシャリング検索命令、
上記アンマーシャリングクラス識別子によって識別されるタイプの上記ソフトウエアオブジェクトの上記インターフェイスと関連づけられたプロキシーを生成するためのクライエントアンマーシャリング生成命令、及び
検索された上記スタブメッセージアドレスで上記プロキシーを初期化するためのクライエントアンマーシャリング初期化命令
を有するクライエントアンマーシャリング命令と、
上記オブジェクトインターフェイススタブに格納された上記ソフトウエアオブジェクトの上記インターフェイスのポインタへアクセスするための検索された上記スタブメッセージアドレスを有する上記プロキシーを使用し、上記サーバプロセスから上記クライエントプロセスへの上記ソフトウエアオブジェクトの上記インターフェイスへアクセスするためのクライエント使用命令と
を有し、
上記クライエントプロセスが上記呼出命令、上記パッキング命令、及び上記送信命令を実行し、次いで、上記サーバプロセスが、上記受取命令、上記アンマーシャリング命令、上記サーバオブジェクト呼出命令、及び上記マーシャリング命令を上記メモリから実行し、次いで、上記クライエントプロセスが、上記クライエント受取命令、上記クライエントアンマーシャリング命令、及び上記クライエント使用命令を呼び出して、上記サーバプロセス中の上記ソフトウエアオブジェクトの上記インターフェイスへアクセスするための上記スタブメッセージアドレスをパスことにより、上記サーバプロセスから上記クライエントプロセスへの上記ソフトウエアオブジェクトの上記インターフェイスにアクセスすることを特徴とするコンピュータシステム。
【請求項２】
上記オブジェクトインターフェイススタブを生成するための上記生成命令は、上記オブジェクトインターフェイススタブに関するオブジェクトインターフェイススタブコードのコピーをロードするための関数命令と、上記スタブメッセージアドレスを受け取るための命令と、上記スタブメッセージアドレスを格納するための命令とをさらに有することを特徴とする請求項１に記載のコンピュータシステム。
【請求項３】
上記アンマーシャリングクラス識別子によって識別されるタイプの上記ソフトウエアオブジェクトの上記インターフェイスと関連づけされた上記プロキシーを生成するための上記クライエントアンマーシャリング生成命令は、
永続的な登録から動的なリンクライブラリーの名前を読み出すための命令と、
上記動的なリンクライブラリーをロードするための命令と、
ロードされた上記動的なリンクライブラリーを使用して、上記アンマーシャリングクラス識別子によって識別されるタイプの上記ソフトウエアオブジェクトの上記インターフェイスと関連づけされた上記プロキシーを生成するための命令と
をさらに有することを特徴とする請求項１に記載のコンピュータシステム。
【請求項４】
ソフトウエアオブジェクトの場所を見つけるための方法についての命令を有するメッセージをパスする中央演算処理装置を有する中央処理装置コンピュータシステムであって、
上記メッセージは、上記コンピュータシステムにおいてサーバプロセスからクライエントプロセスへパスされるものであって、
上記コンピュータシステムは、上記サーバプロセス及び上記クライエントプロセスを維持するメモリを備え、
上記メモリ中の上記クライエントプロセスは、
上記クライエントプロセスの上記メモリ及び上記サーバプロセスの上記メモリの双方に存在する手続きを呼び出すための呼出命令と、
上記手続きの名前及び少なくとも１つのパラメータをメッセージにパッキングするためのパッキング命令と、
上記サーバプロセスの対応するサーバスタブオブジェクトに上記メッセージを送信するための送信命令と、
上記手続きのプロキシーオブジェクトを生成するためのプロキシー生成命令と
を有し、
上記メモリ中の上記サーバプロセスは、
上記サーバスタブオブジェクトで上記クライエントプロセスからの上記メッセージを受け取るための受取命令と、
上記サーバスタブオブジェクトに、上記メッセージから上記手続きの名前及び上記少なくとも１つのパラメータをアンマーシャリングさせるためのアンマーシャリング命令と、
上記サーバスタブオブジェクトに、上記パラメータを用いて上記手続きを起動させ、上記ソフトウエアオブジェクトの上記インターフェイスのポインタを生成するためのサーバオブジェクト呼出命令と、
上記サーバスタブオブジェクトが上記ソフトウエアオブジェクトの上記インターフェイスの上記ポインタをマーシャリングするようにするためのマーシャリング命令であって、
スタブメッセージアドレス及びアンマーシャリングクラス識別子を有するオブジェクトインターフェイススタブを生成するための生成命令、
上記オブジェクトインターフェイススタブへ上記ソフトウエアオブジェクトの上記インターフェイスの上記ポインタを格納するための格納命令、及び
上記オブジェクトインターフェイススタブに、マーシャリングメッセージを生成させ、上記スタブメッセージアドレス及び上記アンマーシャリングクラス識別子を上記マーシャリングメッセージにパッキングするためのメッセージ生成命令
を有するマーシャリング命令と、
上記クライエントプロセスへ上記マーシャリングメッセージを送信するための送信命令と
を有し、
上記メモリ中の上記クライエントプロセスは、さらに
上記サーバプロセスからの上記マーシャリングメッセージを受け取るための受取命令と、
上記サーバプロセスからの上記マーシャリングメッセージをアンマーシャリングするためのアンマーシャリング命令であって、
受け取った上記マーシャリングメッセージから上記スタブメッセージアドレス及び上記アンマーシャリングクラス識別子を検索ためのアンマーシャリング検索命令、
セルプロキシーを生成する上記アンマーシャリングクラス識別子のクラスを動的にロードするための動的ロード命令、及び
上記スタブメッセージアドレスを上記セルプロキシーとともに格納するためのクライエント格納命令
を有するクライエントアンマーシャリング命令と、
検索された、上記オブジェクトインターフェイススタブに格納された上記ソフトウエアオブジェクトの上記インターフェイスのポインタへアクセスするための上記スタブメッセージアドレスを有する上記セルプロキシーを使用し、上記サーバプロセスから上記クライエントプロセスへの上記ソフトウエアオブジェクトの上記インターフェイスへアクセスするようにするためのクライエント使用命令と
を有することを特徴とするコンピュータシステム。
【請求項５】
上記メモリ中の上記クライエントプロセスは、永続的な登録から動的にロードされる上記クライエントのオブジェクトをインスタンス生成する命令を読み出すための読み出し命令を含み、
上記永続的な登録は、上記アンマーシャリングクラス識別子を永続的な登録のエントリー指示子に関連付けるエントリーを有することを特徴とする請求項４に記載のコンピュータシステム。
【請求項６】
サーバプロセスから第１クライエントプロセスへの、及び上記第１のクライエントプロセスから第２クライエントプロセスへのソフトウエアオブジェクトのポインタのインターフェイスにアクセスするコンピュータシステムであって、
上記サーバプロセス、上記第１クライエントプロセス、及び上記第２クライエントプロセスを維持するメモリを備え、
上記メモリ中の上記サーバプロセスは、
上記メモリ中にオブジェクトをインスタンス生成するインスタンス生成命令と、
上記オブジェクトのファンクションメンバーを呼び出す要求を受け取り、要求されたファンクションメンバーを当該要求の受け取り時に呼び出すサーバスタブであって、メッセージアドレスを有するサーバスタブを上記メモリ中に形成する形成命令と、
上記第１及び第２のクライエントプロセスでインスタンス生成されるべきオブジェクトのクラスを識別するアンマーシャリングクラス識別子と上記サーバスタブの上記メッセージアドレスとを上記第１クライエントプロセスへ送信する送信命令と
を有し、
上記第１クライエントプロセスは、
上記サーバプロセスからの上記アンマーシャリングクラス識別子と上記サーバスタブの上記メッセージアドレスとを受け取る受取命令と、
上記アンマーシャリングクラス識別子により識別されたクラスの第１プロキシーオブジェクトをインスタンス生成するための第１ソフトウェアモジュールを動的にロードする命令と、
上記アンマーシャリングクラス識別子により識別されたクラスの第１プロキシーオブジェクトであって、上記サーバスタブの上記メッセージアドレスを上記第２クライエントプロセスに送るべきであることを指示するマーシャリングファンクションメンバーを有する第１プロキシーオブジェクトを上記メモリにインスタンス生成し、当該第１プロキシーオブジェクトが上記オブジェクトのファンクションメンバーを呼び出す要求を受け取るときに当該第１プロキシーオブジェクトが当該要求を上記識別された上記サーバスタブへ送信するように当該第１プロキシーオブジェクトを初期化するように、動的にロードされた上記第１ソフトウェアモジュールを実行するための実行命令と、
上記第１プロキシーオブジェクトのマーシャリングファンクションメンバーを呼び出す呼出命令と、
上記アンマーシャリングクラス識別子及び上記サーバスタブの上記メッセージアドレスを上記第２クライエントプロセスに送信する送信命令と
を有し、
上記メモリ中の上記第２クライエントプロセスは、
上記第１クライエントプロセスから上記アンマーシャリングクラス識別子及び上記サーバスタブの上記メッセージアドレスを受け取る受取命令と、
上記アンマーシャリングクラス識別子により識別されたクラスの第２オブジェクトプロキシーをインスタンス生成するための第２ソフトウェアモジュールを動的にロードする命令と、
上記動的にロードされた第２ソフトウェアモジュールを実行して、上記アンマーシャリングクラス識別子により識別されたクラスの第２オブジェクトプロキシーをインスタンス生成し、当該第２オブジェクトプロキシーが上記オブジェクトのファンクションメンバーを呼び出す要求の受け取るときに当該第２オブジェクトプロキシーが当該要求を識別された上記サーバスタブへ送信するように当該第２オブジェクトプロキシーを初期化するための実行命令と
を有し、
上記コンピュータシステム中の中央処理装置は、上記サーバスタブの上記メッセージアドレスを上記メモリ中の上記サーバプロセスから上記メモリ中の上記第１のクライエントプロセス、上記メモリ中の上記第２のクライエントプロセスへパスする命令を実行することを特徴とするコンピュータシステム。
【請求項７】
上記オブジェクトは複数のインターフェイスを有し、かつ上記オブジェクトのポインタは、上記オブジェクトのインターフェイスの１つに対するポインタであることを特徴とする請求項６に記載のコンピュータシステム。
【請求項８】
オブジェクトに対するポインタにアクセスするコンピュータシステムであって、上記ポインタはサーバプロセス及びクライエントプロセス相互間でアクセスされ、上記コンピュータシステムは、
上記サーバプロセス及び上記クライエントプロセスを維持するメモリを備え、
上記メモリ中の上記サーバプロセスは、
上記メモリ中にオブジェクトをインスタンス生成するインスタンス生成命令と、
上記オブジェクトのファンクションメンバーを呼び出す要求を受け取るため、及び上記要求の受け取りに応じてと必要な上記ファンクションメンバーを呼び出すための、メッセージアドレスを有するサーバスタブを上記メモリ中に形成する形成命令と、
上記クライエントプロセス中でインスタンス生成されるオブジェクトのクラスを識別するアンマーシャリングクラス識別子及び上記サーバスタブの上記メッセージアドレスを上記クライエントプロセスへ送信するための送信命令と、
上記サーバプロセス及び上記クライエントプロセスによってアクセス可能なオブジェクトを共用メモリにインスタンス生成するインスタンス生成命令と、
上記オブジェクトのデータメンバーを共用メモリに格納するかを判定する判定命令であって、上記オブジェクトのデータメンバーを共用メモリに格納すると判定すると上記共用メモリ中に格納された上記オブジェクトのデータメンバーのアドレスをメッセージに格納し、上記オブジェクトのデータメンバーを共用メモリに格納しないと判定すると上記共用メモリ中にない上記オブジェクトのメッセージアドレスを上記メッセージに格納する判定命令と、
上記メッセージを生成するためのメッセージ命令であって、上記クライエントプロセス中でインスタンス生成されるべきオブジェクトのクラスを識別するアンマーシャリングクラス識別子を上記メッセージ中に格納する命令、及び上記第１クライエントプロセスに対する上記サーバスタブの上記メッセージアドレスを上記メッセージに格納する格納命令を有するメッセージ命令と、
上記メッセージを上記クライエントプロセスへ送信する送信命令と
を有し、
上記メモリ中の上記クライエントプロセスは、
上記サーバプロセスからの上記メッセージを受け取る受取命令と、
上記メッセージから上記アンマーシャリングクラス識別子を検索する検索命令と、
上記アンマーシャリングクラス識別子によって識別されたクラスのオブジェクトをインスタンス生成するソフトウェアを動的にロードする命令と、
動的にロードされた上記ソフトウェアを実行する実行命令であって、上記アンマーシャリングクラス識別子によって識別されたクラスのオブジェクトであって、アンマーシャリングファンクションメンバーを有するオブジェクトを上記メモリにインスタンス生成する実行命令と、
上記アンマーシャリングクラス識別子によって識別されたクラスのオブジェクトの上記アンマーシャリングファンクションメンバーを呼び出す呼出命令であって、上記アンマーシャリングファンクションメンバーが上記データメンバーについての上記メッセージアドレスを上記オブジェクト中に格納し、上記オブジェクトのファンクションメンバーが上記共用メモリ中の上記データメンバーにアクセスできるようにする呼出命令と
を有し、
上記コンピュータシステム中の中央処理装置は、上記メモリ中の上記サーバプロセスから上記メモリ中のクライエントプロセスへ上記ポインタをパスする命令を実行することを特徴とするコンピュータシステム。
【請求項９】
上記アンマーシャリングクラス識別子は、上記サーバプロセスによってインスタンス生成された上記オブジェクトと同じクラスを識別することを特徴とする請求項８に記載のコンピュータシステム。
【請求項１０】
上記サーバプロセスによってインスタンス生成された上記オブジェクトは、複数のインターフェイスを有し、上記オブジェクトに対するポインタは、上記オブジェクトの当該インターフェイスの１つに対するポインタであることを特徴とする請求項８に記載のコンピュータシステム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は一般にデータをパスするためのコンピュータ方法及びシステムに係り、より詳細には、プロセス間にオブジェクトに対するポインタをパスするための方法及びシステムに係る。
【０００２】
【従来の技術】
コンピュータシステムは、通常、マルチタスク動作をサポートするオペレーティングシステムを有している。マルチタスクオペレーティングシステムは、多数のタスク（プロセス）を同時に実行できるようにする。例えば、データベースサーバプロセスは、該データベースサーバプロセスのサービスを要求する多数のクライエントプロセスと同時に実行することができる。クライエントプロセス（クライエント）は、遠隔手続き呼び出し（ＲＰＣ）を発行することによりサービスを要求する。遠隔手続き呼び出しは、サーバプロセス（サーバ）がクライエントに代わってサーバ手続きを呼び出せるようにする。遠隔手続き呼び出しを発行するために、クライエントは、手続きの名前及び手続きのための実際の入パラメータをプロセス間通信メッセージへとパッケージしそしてそのメッセージをサーバへ送信する。サーバは、そのメッセージを受け取り、それをアンパッケージして手続きの名前と実際の入パラメータとに分け、その名前の付いた手続きを呼び出し、アンパッケージした入パラメータをそれにパスする。手続きが完了すると、サーバは、出パラメータをメッセージへとパッケージしそしてそのメッセージをクライエントへ送信する。パラメータをパッケージするプロセスは、「マーシャリング(marshalling)」として知られており、そしてパラメータをアンパッケージするプロセスは「アンマーシャリング(unmarshalling)」として知られている。
【０００３】
パラメータは、実際のパラメータの値のコピーをメッセージに記憶することによりマーシャリングされる。ある形式のパラメータについては、マーシャリングは、値のコピーを単に記憶する以上のものを伴う。例えば、浮動小数点の値は、プロセスが異なるコンピュータシステムにあるときには、あるコンピュータシステムのフォーマットから別のコンピュータシステムのフォーマットに変換することが必要となる。
【０００４】
実際のパラメータの値をコピーする場合には幾つかの欠点がある。第１に、コピーがパスされた場合に、元の値に対する変更がコピーに反映されない。例えば、１日の時間の値を表すパラメータがコピーによってクライエントからサーバへパスされる場合には、クライエントが１日の時間の値を更新したときに、サーバが受け取るコピーは更新されない。第２に、ある形式のパラメータの場合に、値のコピーをとることが不可能である。例えば、大きなアレーをコピーする場合のオーバーヘッドは受け入れられない。又、以下に述べるように、オブジェクトは大きく且つ種々のファンクションを含んでいるので、オブジェクトをマーシャリングするときにはオブジェクトのコピーをとることも不可能である。
【０００５】
オブジェクト指向のプログラミング技術の使用は、公知技術に勝る多数の利点を有している。従って、オブジェクト指向の技術の使用が増加している。しかしながら、遠隔手続きを呼び出すときにオブジェクトを効率的にマーシャリング及びアンマーシャリングできないために、これらの利点が制限される。オブジェクトが通常いかにマーシャリング及びアンマーシャリングされるかの説明がこれらの制限を説明する助けとなろう。
【０００６】
図１は、オブジェクトを表すのに使用される典型的なデータ構造体を示すブロック図である。オブジェクトは、オブジェクトの振舞いを具現化するインスタンスデータ（データメンバー）及びメンバーファンクションで構成される。オブジェクトを表すのに使用されるデータ構造体は、インスタンスデータ構造体１０１と、仮想ファンクションテーブル１０２と、ファンクションメンバー１０３、１０４、１０５とを備えている。インスタンスデータ構造体１０１は、仮想ファンクションテーブル１０２に対するポインタを含むと共に、データメンバーを含んでいる。仮想ファンクションテーブル１０２は、オブジェクトに対して定義された各仮想ファンクションメンバーのエントリーを含む。各エントリーは、対応するファンクションメンバーを具現化するコードに対する参照を含んでいる。このサンプルオブジェクトのレイアウトは、参考としてここに取り上げる「オブジェクト指向のプログラミング言語のためのコンパイラーにおいて仮想ファンクション及び仮想ベースを具現化する方法(A Method for Implementing Virtual Finctions and Virtual Bases in a Compiler for an Object Oriented Programming Language) 」と題する米国特許出願第０７／６８２，５３７号に定義されたモデルに合致する。以下の説明において、オブジェクトは、Ｃ＋＋プログラミング言語により定義されたクラスのインスタンスとして説明する。当業者であれば、オブジェクトは、他のプログラミング言語を用いても定義できることが明らかであろう。
【０００７】
遠隔手続き呼び出し中にサーバプロセスのオブジェクトをコピーしてクライエントプロセスにパスするべき場合には、データメンバーをコピーするだけでなく、ファンクションメンバーもクライエントプロセスにアクセスされねばならない。コピーされたオブジェクトにアクセスするには、クライエントプロセスは、各ファンクションメンバーをそれ自身のプロセススペースにロードする必要がある。このロード動作は時間がかかる。更に、オブジェクトをコピーすることは、手に負えないものである。というのは、サーバプロセススペースにロードされるファンクションメンバーは、サーバプロセススペースにおけるデータ又は他のファンクションをアクセスする必要があるからである。
【０００８】
オブジェクト指向の技術を用いる利点は、これらの技術を使用して複合文書を容易に形成できることである。複合文書とは、種々のコンピュータプログラムによって発生されたオブジェクトを含む文書である。（通常、複合文書にはオブジェクトのデータメンバー及びクラスタイプのみが記憶される。）例えば、スプレッドシートプログラムにより発生されたスプレッドシートオブジェクトを含むワードプロセス文書は、複合文書である。ワードプロセスプログラムは、ユーザがスプレッドシートオブジェクト（例えば、セル）をワードプロセス文書内に埋め込みできるようにする。この埋め込みを行えるようにするために、ワードプロセスプログラムは、埋め込まれたオブジェクトのファンクションメンバーをアクセスするために、埋め込まれるべきオブジェクトのクラス定義を用いてコンパイルされる。従って、ワードプロセスプログラムは、ワードプロセス文書に埋め込みできるオブジェクトの各クラスのクラス定義を用いてコンパイルされる必要がある。新たなクラスのオブジェクトをワードプロセス文書に埋め込むために、ワードプロセスプログラムは、新たなクラス定義で再コンパイルされる必要がある。従って、ワードプロセスプログラムの開発者によって選択されたクラスのオブジェクトしか埋め込むことができない。更に、新たなクラスは、ワードプロセスプログラムが新たにリリースされないとサポートできない。
【０００９】
任意のクラスのオブジェクトを複合文書に埋め込めるようにするために、インターフェイス（抽象クラス）が定義され、これにより、ワードプロセスプログラムがコンパイル時にクラス定義にアクセスする必要なく、オブジェクトをアクセスすることができる。抽象クラスとは、仮想ファンクションメンバーが具現化をもたない（純粋な）クラスである。インターフェイスとは、データメンバーをもたずそしてその仮想ファンクションが全て純粋であるような抽象クラスである。
【００１０】
以下のクラス定義は、インターフェイスの例示的な定義である。この例において、説明を簡単にするために、オブジェクトのクラスをその文書に埋め込みできるようにするのではなく、ワードプロセスプログラムは、スプレッドシートオブジェクトを埋め込みできるようにする。このインターフェイスを与えるスプレッドシートオブジェクトは、オブジェクトをいかに具現化するかにかかわりなく、埋め込むことができる。更に、スプレッドシートオブジェクトは、ワードプロセスプログラムがコンパイルされる前に具現化されるかその後に具現化されるかに関わりなく、埋め込むことができる。
【００１１】
【数１】
0003822541.tif 000002
【００１２】
スプレッドシートプログラムの開発者は、スプレッドシートオブジェクトをワードプロセス文書に埋め込めるようにするためにインターフェイスを具現化する必要がある。ワードプロセスプログラムがスプレッドシートオブジェクトを埋め込むときには、プログラムは、スプレッドシートオブジェクトに対するインターフェイスを具現化するコードをアクセスする必要がある。コードをアクセスするために、各具現化には独特のクラス識別子が与えられる。例えば、マイクロソフト社によって開発されたスプレッドシートオブジェクトは、「ＭＳＳｐｒｅａｄｓｈｅｅｔ」のクラス識別子を有し、一方、他社によって開発されたスプレッドシートオブジェクトは、「ＬＴＳＳｐｒｅａｄｓｈｅｅｔ」のクラス識別子を有する。クラスを具現化するコードに対して各クラス識別子をマップする各コンピュータシステムの永続的な登録が維持される。通常、スプレッドシートプログラムがコンピュータシステムにインストールされるときには、スプレッドシートオブジェクトのそのクラスの利用性を反映するように永続的な登録が更新される。スプレッドシート開発者がインターフェイスによって定義された各ファンクションメンバーを具現化しそして永続的な登録が維持される限り、ワードプロセスプログラムは、開発者のスプレッドシートオブジェクトをワードプロセス文書に埋め込むことができる。
【００１３】
しかしながら、種々のスプレッドシート開発者は、あるファンクションメンバーのみを具現化することを希望する。例えば、あるスプレッドシート開発者は、データベースサポートを具現化することを望まないが、他の全てのファンクションメンバーをサポートすることを望む。スプレッドシート開発者が、オブジェクトを埋め込めるようにしながらも、幾つかのファンクションメンバーのみをサポートできるようにするために、スプレッドシートオブジェクトに対する多数のインターフェイスが定義されている。例えば、インターフェイスＩＤａｔａｂａｓｅ及びＩＢａｓｉｃは、スプレッドシートオブジェクトに対し、次のように定義される。
【００１４】
【数２】
0003822541.tif 000003
各スプレッドシート開発者は、ＩＢａｓｉｃインターフェイスを具現化し、そして任意にＩＤａｔａｂａｓｅインターフェイスを具現化する。
【００１５】
実行時に、ワードプロセスプログラムは、埋め込まれるべきスプレッドシートオブジェクトがＩＤａｔａｂａｓｅインターフェイスをサポートするかどうかを判断しなければならない。この判断をなすために、オブジェクトに対してどのインターフェイスが具現化されるかを指示するファンクションメンバーと共に、別のインターフェイスが定義される（各スプレッドシートオブジェクトがそれを具現化する）。このインターフェイスは、ＩＵｎｋｎｏｗｎとして知られており、次のように定義される。
【００１６】
【数３】
0003822541.tif 000004
【００１７】
ＩＵｎｋｎｏｗｎインターフェイスは、ファンクションメンバー（メソッド）ＱｕｅｒｙＩｎｔｅｒｆａｃｅを定義する。このメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅには、インターフェイス識別子（例えば、「ＩＤａｔａｂａｓｅ」）がパスされ、そしてこのメソッドは、これが呼び出されたところのオブジェクトに対し識別されたインターフェイスの具現化を指すポインタを返送する。オブジェクトがインターフェイスをサポートしない場合には、このメソッドは「偽」を返送する。
【００１８】
ＩＤａｔａｂａｓｅインターフェイス及びＩＢａｓｉｃインターフェイスは、ＩＵｎｋｎｏｗｎインターフェイスを継承する。継承は、オブジェクト指向の技術では良く知られており、これにより、クラス定義は、既に定義されたクラスのデータ及びファンクションメンバーを組み込むことができる。次の定義は、ＩＵｎｋｎｏｗｎインターフェイスの使用を示すものである。
【００１９】
【数４】
0003822541.tif 000005
【００２０】
図２は、スプレッドシートオブジェクトのサンプルデータ構造体を示すブロック図である。このスプレッドシートオブジェクトは、インターフェイスデータ構造体２０１と、ＩＢａｓｉｃインターフェイスデータ構造体２０２と、ＩＤａｔａｂａｓｅインターフェイスデータ構造体２０５と、メソッド２０８ないし２１２とを備えている。インターフェイスデータ構造体２０１は、具現化される各インターフェイスに対するポインタを含み、そして具現化のデータメンバーを含んでもよい。ＩＢａｓｉｃインターフェイスデータ構造体２０２は、インスタンスデータ構造体２０３及び仮想ファンクションテーブル２０４を含む。仮想ファンクションテーブル２０４の各エントリーは、ＩＢａｓｉｃインターフェイスに対して定義されたメソッドを指す。ＩＤａｔａｂａｓｅインターフェイスデータ構造体２０５は、インスタンスデータ構造体２０６及び仮想ファンクションテーブル２０７を含む。仮想ファンクションテーブル２０７の各エントリーは、ＩＤａｔａｂａｓｅインターフェイスで定められたメソッドに対するポインタを含む。ＩＢａｓｉｃ及びＩＤａｔａｂａｓｅインターフェイスはＩＵｎｋｎｏｗｎインターフェイスを継承するので、各仮想ファンクションテーブル２０４及び２０７は、メソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅ２０８に対するポインタを含む。以下の説明では、オブジェクトデータ構造体は、オブジェクトをアクセスするところのインターフェイスで示された形状２１３によって表される。
【００２１】
以下の擬似コードは、スプレッドシートオブジェクトがＩＤａｔａｂａｓｅインターフェイスをサポートするかどうかをワードプロセスプログラムがいかに決定するかを示すものである。
【００２２】
【数５】
0003822541.tif 000006
【００２３】
ポインタｐＩＢａｓｉｃは、オブジェクトのＩＢａｓｉｃインターフェイスに対するポインタである。オブジェクトがＩＤａｔａｂａｓｅインターフェイスをサポートする場合には、メソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅは、ポインタｐＩＤａｔａｂａｓｅを、ＩＤａｔａｂａｓｅデータ構造体を指すようにセットし、そしてその値として「真」を返送する。
【００２４】
通常は、オブジェクトは、変数宣言によるか又は「新たな」演算子によりインスタンス生成することができる（メモリに形成されたオブジェクトのインスタンス）。しかしながら、両インスタンス生成技術は、コンパイル時にクラス定義を必要とする。ワードプロセスプログラムが実行時にスプレッドシートオブジェクトをインスタンス生成できるようにするには、異なる技術が必要とされる。その１つの技術は、ＩＣｌａｓｓＦａｃｔｏｒｙと称するインターフェイスを与えるもので、これは、次のように定義される。
【００２５】
【数６】
0003822541.tif 000007
メソッドＣｒｅａｔｅＩｎｓｔａｎｃｅはオブジェクトをインスタンス生成し、そしてアーギュメント（引数）ｉｉｄＩｎｔｅｒｆａｃｅによって指定されたオブジェクトのインターフェイスに対するポインタｐＩｎｔｅｒｆａｃｅを返送する。
【００２６】
上記のインターフェイスを使用して、オブジェクトを複合文書に容易に埋め込むことはできるが、遠隔手続き呼び出しにおいてオブジェクト（インターフェイス）に対するポインタをパラメータとしてパスさせるようにする効率的な技術が要望される。ポインタをパスすることは、オブジェクトをコピーするオーバーヘッドを回避すると共に、送信プロセスがオブジェクトに対して行う変更を受信プロセスが見れるようにする。
【００２７】
【発明が解決しようとする課題】
本発明の目的は、クライエントプロセスが、サーバプロセスにおいてインスタンス生成されたオブジェクトのインターフェイスをアクセスできるようにするための方法及びシステムを提供することである。
【００２８】
本発明の別の目的は、オブジェクトに対するポインタをクラスに特定に（カスタム）マーシャリング及びアンマーシャリングするメソッドをオブジェクトが具現化できるようにするための方法及びシステムを提供することである。
【００２９】
本発明の更に別の目的は、プロセス間にオブジェクトのインターフェイスに対するポインタをパスするための方法及びシステムを提供することである。
【００３０】
【課題を解決するための手段】
これら及び他の目的は、本発明の以下の詳細な説明から明らかとなるように、インターフェイスに対するポインタをサーバプロセスからクライエントプロセスへパスするための方法及びシステムによって達成される。好ましい実施例において、サーバプロセスは、多数のインターフェイスを有するオブジェクトをインスタンス生成する。サーバプロセスは、クライエントプロセスへパスするためのインターフェイスを識別し、そしてそのインターフェイスのファンクションメンバーを呼び出すための要求を受け取ってその要求されたファンクションメンバーを要求受け取り時に呼び出すためのスタブオブジェクトを形成する。次いで、サーバプロセスは、スタブの識別子をクライエントプロセスへ送信する。クライエントプロセスは、スタブの識別子を受け取ると、インターフェイスのファンクションメンバーを呼び出すための要求を受け取ってその要求を識別されたスタブへ送信するためのプロキシーオブジェクトをインスタンス生成する。別の実施例においては、サーバプロセスは、プロキシーオブジェクトのクラスをクライエントプロセスへ送信し、クライエントは、プロキシーオブジェクトをインスタンス生成するようにコードを動的にロードする。別の実施例において、オブジェクトは、オブジェクトのインターフェイスに対するポインタをカスタムマーシャリング及びアンマーシャリングするメソッドでインターフェイスを具現化する。これらのメソッドは、インターフェイスに対するポインタをマーシャリング及びアンマーシャリングするために呼び出される。
【００３１】
【発明の実施の形態】
本発明は、遠隔手続き呼び出しにおいてオブジェクトに対するポインタをパラメータとしてパスするための方法及びシステムを提供する。好ましい実施例では、サーバプロセスは、オブジェクトのインターフェイスに対するポインタをクライエントプロセスにパスする。サーバは、インターフェイスに対するポインタをマーシャリングし、そしてそのマーシャリングされたポインタをクライエントへ送る。クライエントプロセスは、ポインタをアンマーシャリングし、そしてそのアンマーシャリングされたポインタを用いてパスされたオブジェクトをアクセスする。本発明のマーシャリング及びアンマーシャリング技術は、コードをロードし、そしてクライエントによるオブジェクトのアクセスをサポートするためのデータ構造体を発生する。
【００３２】
図３は、マーシャリング及びアンマーシャリング中に発生されるデータ構造体及びロードされるコードを示すブロック図である。このデータ構造体及びコードは、サーバ内のオブジェクト３０１及びスタブオブジェクト３０２と、クライエント内のプロキシーオブジェクト３０３とを備えている。プロキシー３０３及びスタブ３０２は、オブジェクト３０１に対するポインタがクライエントにパスされたときに形成される。サーバのマーシャリングプロセスは、スタブ３０２に対するコードをロードし、スタブに対するプロセス間通信メッセージアドレスを指定し、オブジェクト３０１のインターフェイスに対するポインタをスタブ内に記憶し、そしてスタブのメッセージアドレス及びプロキシーのクラス識別子をメッセージへとパッケージすることにより、オブジェクト３０１のインターフェイスに対するポインタをマーシャリングする。次いで、サーバは、メッセージをクライエントへ送信する。クライエントがメッセージを受け取ると、クライエントは、プロキシーのクラス識別子及びスタブのメッセージアドレスを検索し、その検索されたインスタンス生成プロキシー３０３により識別されるクラス識別子のクラスのインスタンスを形成するようにコードを動的にロードし、そしてスタブメッセージアドレスをプロキシー３０３と共に記憶することにより、オブジェクト３０１のインターフェイスに対するポインタをアンマーシャリングする。次いで、クライエントは、プロキシー３０３によりオブジェクト３０１のインターフェイスをアクセスする。
【００３３】
プロキシー３０３は、オブジェクト３０１のインターフェイスと同じインターフェイスを異なる具現化により具現化するオブジェクトである。プロキシー３０３の各メソッドは、その名前及びその実際のパラメータをメッセージへとマーシャリングし、メッセージをスタブ３０２へ送信し、スタブ３０２からの返送メッセージを待機し、そしてその返送されたパラメータをアンマーシャリングする。テーブル１は、「Ｆｉｌｅ（ファイル）」と称するプロキシーメソッドに対する例示的な擬似コードをリストしたものである。
【００３４】
【数７】
0003822541.tif 000008
【００３５】
スタブ３０２は、クライエントからメッセージを受け取り、メソッド名及び入パラメータをアンマーシャリングして、オブジェクト３０１の名前付けされたメソッドを呼び出し、出パラメータをメッセージへとマーシャリングし、そしてそのメッセージをプロキシー３０３へ送信するというインターフェイスを具現化するオブジェクトである。テーブル２は、スタブに対する例示的な擬似コードをリストしたものである。
【００３６】
【数８】
0003822541.tif 000009
【００３７】
図４Ａないし４Ｃは、インターフェイスポインタのマーシャリングを示すブロック図である。サーバ４０１は、スプレッドシートオブジェクト４０３、セルオブジェクト４０４、及びセルオブジェクト４０５を含む。スプレッドシートオブジェクト４０３は、ＩＢａｓｉｃインターフェイスの具現化を有する。ＩＢａｓｉｃインターフェイスのメソッドＧｅｔＣｅｌｌは、次のプロートタイプにより定義される。
void GetCell(string RC，cell*pCell)
【００３８】
メソッドＧｅｔＣｅｌｌは、パスされた行／列指示子（ＲＣ）により指定されたセルを表すセルオブジェクトに対するポインタを検索しそしてそのセル（ｐＣｅｌｌ）に対するポインタを返送する。セルオブジェクト４０４及び４０５は、インターフェイスＩＤａｔａの具現化を有し、これは、次により定義される。
【００３９】
【数９】
0003822541.tif 000010
【００４０】
メソッドＧｅｔＦｏｒｍｕｌａは、セルオブジェクトの式の値をストリングとして返送し、そしてメソッドＳｅｔＦｏｒｍｕｌａは、セルオブジェクトにおける式をパスされたストリングにセットする。
【００４１】
図４Ｂは、クライエントへのセルオブジェクトをマーシャリングする動作を示すブロック図である。クライエントが、セルオブジェクト４０４として示されたセルＡ１の式を検索しようとするときには、クライエントは次のステートメントを実行する。
【００４２】
【数１０】
0003822541.tif 000011
【００４３】
スプレッドシートプロキシー４０７は、ポインタｐＩＢａｓｉｃ４０８により指示される。クライエントは、先ず、スプレッドシートプロキシーメソッドＧｅｔＣｅｌｌを呼び出す。このメソッドＧｅｔＣｅｌｌは、メソッド名「ＧｅｔＣｅｌｌ」及びストリング「Ａ１」をメッセージへとパッケージし、そしてそのメッセージをスプレッドシートスタブ４０６へ送信する。スプレッドシートスタブ４０６はメソッド名及びストリングをアンパッケージする。次いで、スプレッドシートスタブ４０６は、スプレッドシートオブジェクト４０３のメソッドＧｅｔＣｅｌｌを呼び出す。メソッドＧｅｔＣｅｌｌは、セルオブジェクト４０４に対するポインタをスプレッドシートスタブ４０６へ返送する。次いで、スプレッドシートスタブ４０６は、セルオブジェクト４０４に対するセルスタブ４０９を形成し、メッセージアドレスをセルスタブ４０９に指定し、メッセージアドレス及びアンマーシャリングされたクラス識別子（以下に述べる）をメッセージへとパッケージしそしてそのメッセージをスプレッドシートプロキシー４０７へ送信することにより、セルポインタをマーシャリングする。スプレッドシートプロキシー４０７がメッセージを受信すると、メソッドＧｅｔＣｅｌｌは、セルオブジェクト４０４に対するポインタをアンマーシャリングする。
【００４４】
図４Ｃは、セルポインタのアンマーシャリング中に使用されるデータ構造体を示すブロック図である。メソッドＧｅｔＣｅｌｌは、先ず、メッセージアドレス及びアンマーシャリングクラス識別子（ＣｅｌｌＰｒｏｘｙ）を受け取ったメッセージから検索することにより、セルＡ１に対するポインタをアンマーシャリングする。好ましい実施例では、永続的な登録４１３は、各クラスごとに動的なリンクライブラリーの名前を含む。動的なリンクライブラリーは、プログラムのランタイムにロードされるルーチン（メソッド、ファンクション、等）のライブラリーである。動的なリンクライブラリーは、マイクロソフト・プレス社により出版されたチャレス・ペトゾルド著の参考文献「プログラミングウインドウズ」に説明されている。クラスに対する各動的なリンクライブラリーは、クラスに対しＩＣｌａｓｓＦａｃｔｏｒｙインターフェイスを指すポインタを返送するファンクションＧｅｔＩＣｌａｓｓＦａｃｔｏｒｙを含んでいる。メソッドＧｅｔＣｅｌｌは、検索されたアンマーシャリングクラス識別子（アンマーシャリングクラス）に対して動的なリンクライブラリー４１０をロードし、そしてファンクションＧｅｔＩＣｌａｓｓＦａｃｔｏｒｙを呼び出し、これは、ＩＣｌａｓｓＦａｃｔｏｒｙインターフェイス４１１に対するポインタを返送する。次いで、メソッドＧｅｔＣｅｌｌは、ＩＣｌａｓｓＦａｃｔｏｒｙインターフェイス４１１のメソッドＣｒｅａｔｅＩｎｓｔａｎｃｅを呼び出し、セルプロキシー４１２を形成する。セルプロキシー４１２は、次いで、セルスタブ４０９に対して検索されたメッセージアドレスで初期化される。次いで、メソッドＧｅｔＣｅｌｌは、セルプロキシー４１２に対するポインタを返送する。これで、クライエントは、セルプロキシー４１２を介してセルオブジェクト４０４をアクセスすることができる。
【００４５】
図５は、メソッドＧｅｔＣｅｌｌを示す流れ線図である。ステップ５０１ないし５０５は、スプレッドシートプロキシーのＩＢａｓｉｃインターフェイスのメソッドＧｅｔＣｅｌｌに対する流れ線図である。ステップ５０６ないし５１２は、スプレッドシートスタブに対する流れ線図を構成する。メソッドＧｅｔＣｅｌｌは、入パラメータをマーシャリングし、そのマーシャリングされたパラメータをスプレッドシートスタブへ送り、入パラメータにより指示されたセルオブジェクトに対するマーシャリングされたポインタを受け取る。ステップ５０１において、このメソッドは、ファンクションＭａｒｓｈａｌを呼び出して、メソッド名（即ち「ＧｅｔＣｅｌｌ」）をメッセージ５０１Ａへとマーシャリングする。ファンクションＭａｒｓｈａｌ及びＵｎＭａｒｓｈａｌは、データをメッセージにパッケージしたりアンパッケージしたりする。ステップ５０２において、このメソッドは、ファンクションＭａｒｓｈａｌを呼び出し、入パラメータＲＣをメッセージ５０２Ａへとマーシャリングする。ステップ５０３において、このメソッドは、メッセージをスプレッドシートスタブへ送る。ステップ５０４において、このメソッドは、スプレッドシートスタブからメッセージを受け取る。ステップ５０５において、このメソッドは、ファンクションＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅを呼び出し、メッセージ５０５Ａにおいて受け取ったインターフェイスポインタをアンマーシャリングする。
このメソッドは、次いで、セルプロキシーを指すポインタｐＣｅｌｌを返送する。
【００４６】
ステップ５０６において、スタブは、クライエントから送られたメッセージを受け取ると共に、メッセージを送ったセルプロキシーのメッセージアドレスを受け取る。ステップ５０７において、スタブは、ファンクションＵｎＭａｒｓｈａｌを呼び出して、メソッド名をメッセージ５０７Ａからアンマーシャリングする。ステップ５０８において、メソッド名が「ＧｅｔＣｅｌｌ」である場合は、スタブはステップ５０９に続き、さもなくば、スタブは、メソッド名がＩＢａｓｉｃインターフェイスの別のメソッド（楕円で示すような）対応するかどうか判断し続ける。ステップ５０９において、スタブは、ファンクションＵｎＭａｒｓｈａｌを呼び出し、セルの位置を指定する入パラメータをメッセージ５０９Ａからアンマーシャリングする。ステップ５１０において、スタブは、スプレッドシートオブジェクトに対するメソッドＧｅｔＣｅｌｌを呼び出し、セルの位置をパスする。メソッドＧｅｔＣｅｌｌは、パスされた位置に対するセルオブジェクトのポインタを返送する。ステップ５１１において、スタブは、ファンクションＭａｒｓｈａｌＩｎｔｅｒｆａｃｅを呼び出して、セルオブジェクトに対するポインタをそれにパスする。ステップ５１２において、スタブは、メッセージ５１１Ａを、ステップ５０６で受け取ったメッセージを送ったセルプロキシーへ送信する。次いで、スタブは、ステップ５０６へループし、次のメッセージを待機する。
【００４７】
上記のマーシャリング技術は、標準的マーシャリングと称する。好ましい実施例において、本発明は、カスタムマーシャリングと称するプロセスにおいてオブジェクトに対するポインタをいかにマーシャリングすべきかをオブジェクトが指定できるようにする。カスタムマーシャリングを具現化する各オブジェクトは、ＩＭａｒｓｈａｌと称するカスタムマーシャリングインターフェイスの具現化を与える。ＩＭａｒｓｈａｌインターフェイスは、インターフェイスポインタをマーシャリング及びアンマーシャリングするためのファンクションメンバーを与える。インターフェイスに対するポインタをマーシャリング及びアンマーシャリングするときには、オブジェクトのメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅが呼び出されて、オブジェクトがＩＭａｒｓｈａｌインターフェイスを具現化するかどうか判断する。オブジェクトがＩＭａｒｓｈａｌインターフェイスを具現化する場合には、そのインターフェイスのファンクションメンバーが呼び出されて、インターフェイスポインタをマーシャリング及びアンマーシャリングする。図５において、ファンクションＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅ（ステップ５０５）及びＭａｒｓｈａｌＩｎｔｅｒｆａｃｅ（ステップ５１１）は、オブジェクトがＩＭａｒｓｈａｌインターフェイスを具現化するかどうか判断しそしてＩＭａｒｓｈａｌインターフェイスのファンクションメンバーを適宜に呼び出すのが好ましい。
【００４８】
図６ないし１０は、セルオブジェクトに対するポインタのマーシャリング及びアンマーシャリング中に呼び出されるメソッドとファンクションの流れ線図である。
【００４９】
以下に述べるように、これらメソッド及びファンクションは、標準的マーシャリングを具現化するものである。
【００５０】
図６はファンクションＭａｒｓｈａｌＩｎｔｅｒｆａｃｅの流れ線図である。このファンクションは、次のプロートタイプを有する。
void MarshalInterface(pstm,iid,pInterface,DestContext)
【００５１】
このファンクションは、オブジェクトに対するインターフェイスの指定のポインタ（ｐＩｎｔｅｒｆａｃｅ）を指定のメッセージ（ｐｓｔｍ）へとマーシャリングする。ステップ６０１において、このファンクションは、オブジェクトがカスタムマーシャリングを具現化するかどうか判断する。このファンクションは、インターフェイスのメソッドＱｕｅｒｙＩｎｔｅｒｆａｃｅを呼び出し、ＩＭａｒｓｈａｌインターフェイスに対するポインタを検索する。オブジェクトがカスタムマーシャリングを具現化する場合には、オブジェクトに対するＩＭａｒｓｈａｌインターフェイスのポインタ（ｐＭａｒｓｈａｌ）が返送され、そしてファンクションはステップ６０３に続くが、さもなくば、このファンクションはステップ６０２に続く。ステップ６０２において、このファンクションは、ファンクションＧｅｔＳｔａｎｄａｒｄＭａｒｓｈａｌを呼び出して、ＩＭａｒｓｈａｌインターフェイスに対するポインタ（ｐＭａｒｓｈａｌ）をデフォールトマーシャリングメソッドで検索する。ステップ６０３において、このファンクションは、検索されたポインタにより指示されたメソッドＩＭａｒｓｈａｌ：：ＧｅｔＵｎＭａｒｓｈａｌＣｌａｓｓを呼び出す。メソッドＧｅｔＵｎＭａｒｓｈａｌＣｌａｓｓは、指定のインターフェイス（ｉｉｄ）に対するプロキシーをインスタンス生成するためにアンマーシャリングプロセスに使用すべきクラスのクラス識別子を返送する。ステップ６０４において、このファンクションは、ファンクションＭａｒｓｈａｌを呼び出して、アンマーシャリングのクラス識別子を指定のメッセージへとマーシャリングする。ステップ６０５において、このファンクションは、検索されたポインタ（ｐＭａｒｓｈａｌ）によって指示されたメソッドＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅを呼び出す。メソッドＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、指定のインターフェイスポインタ（ｐＩｎｔｅｒｆａｃｅ）を指定のメッセージへとマーシャリングする。次いで、このメソッドは復帰となる。
【００５２】
図７は、メソッドＭａｒｓｈａｌＩｎｔｅｒｆａｃｅの例示的な標準的具現化を示す流れ線図である。このメソッドは、次のプロートタイプを有する。
void IMarshal::MarshalInterface(pstm,idd,pInterface,DestContext)
【００５３】
メソッドＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、インターフェイス（ｐＩｎｔｅｒｆａｃｅ）に対する指定のポインタを指定のメッセージ（ｐｓｔｍ）へとマーシャリングする。ステップ７０１において、このメソッドは、ファンクションＭａｋｅＳｔｕｂを呼び出す。このファンクションＭａｋｅＳｔｕｂは、インターフェイスに対する指定のポインタのためのスタブを形成し、そのスタブのメッセージアドレスを返送する。ステップ７０２において、このメソッドは、ファンクションＭａｒｓｈａｌを呼び出し、指定のメッセージにおける返送されたメッセージアドレスをマーシャリングする。このメソッドは、次いで、復帰する。
【００５４】
図８は、ファンクションＭａｋｅＳｔｕｂの流れ線図である。このファンクションは、次のプロートタイプを有する。
void MakeStub(cid,iid,pInterface,MessageAddress)
【００５５】
このファンクションＭａｋｅＳｔｕｂは、指定のインターフェイス（ｉｉｄ）に対する指定のポインタ（ｐＩｎｔｅｒｆａｃｅ）のスタブを形成し、そしてそのスタブのメッセージアドレス（ＭｅｓｓａｇｅＡｄｄｒｅｓｓ）を返送する。ステップ８０１において、このファンクションは、指定のインターフェイスに対するスタブコードのコピーをロードする。ステップ８０２において、このファンクションは、インターフェイスに対する指定のポインタを記憶し、スタブコードをアクセスできるようにする。ポインタを記憶することは、スタブコードを、指定のポインタによって指示されたオブジェクトに関連付けする。ステップ８０３において、このファンクションは、スタブコードをメッセージシステムと共に登録する。メッセージシステムは、スタブのメッセージアトルスを返送する。ステップ８０４において、このファンクションは、発呼者へ返送するためにメッセージアドレスを記憶する。次いで、ファンクションＭａｋｅＳｔｕｂは復帰となる。
【００５６】
図９は、ファンクションＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅの流れ線図である。このファンクションは、次のプロートタイプを有する。
viod UnMarshalInterface(pstm,iid,pInterface)
【００５７】
ファンクションＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、指定されたメッセージ（ｐｓｔｍ）において既にマーシャリングされたインターフェイスに対するポインタをアンマーシャリングし、そしてオブジェクトの指定のインターフェイス（ｉｉｄ）に対するポインタ（ｐＩｎｔｅｒｆａｃｅ）を返送する。ステップ９０１において、このファンクションは、ファンクションＵｎＭａｒｓｈａｌを呼び出し、指定のメッセージからのアンマーシャリングクラス識別子をアンマーシャリングする。ステップ９０２において、このファンクションは、ファンクションＧｅｔＣｌａｓｓＯｂｊｅｃｔを呼び出し、アンマーシャリングクラス識別子（アンマーシャリングクラス）により指示されたクラスに対するＩＣｌａｓｓＦａｃｔｏｒｙインターフェイスを検索する。ステップ９０３において、このファンクションは、検索されたＩＣｌａｓｓＦａｃｔｏｒｙのメソッドＣｒｅａｔｅＩｎｓｔａｎｃｅを呼び出し、プロキシーのインスタンスを形成し、そしてそのＩＭａｒｓｈａｌインターフェイスに対するポインタを返送する。ステップ９０４において、このファンクションは、プロキシーのメソッドＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅを呼び出す。次いで、ファンクションＵｎＭａｒｓｈａｌは復帰となる。
【００５８】
図１０は、メソッドＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅの例示的な具現化を示す流れ線図である。このメソッドは、次のプロートタイプを有する。
void IMarshal::UnMarshalInterface(pstm,iid,pInterface)
【００５９】
メソッドＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、新たに形成されたプロキシーを初期化し、そして指定のインターフェイス（ｉｉｄ）に対するポインタ（ｐＩｎｔｅｒｆａｃｅ）を返送する。ステップ１００１において、このメソッドはファンクションＵｎＭａｒｓｈａｌを呼び出し、指定のメッセージからスタブメッセージアドレスをアンマーシャリングする。ステップ１００２において、このメソッドは、スタブメッセージアドレスを記憶する。ステップ１００３において、このメソッドは指定のインターフェイスに対するポインタを検索する。次いで、このメソッドＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは復帰となる。
【００６０】
図１１は、ファンクションＧｅｔＣｌａｓｓＯｂｊｅｃｔの流れ線図である。このファンクションは、次のプロートタイプを有する。
void GetClassObject(cid,iid,pInterface)
【００６１】
ファンクションＧｅｔＣｌａｓｓＯｂｊｅｃｔは、指定のクラス（ｃｉｄ）の指定のインターフェイス（ｉｉｄ）に対するポインタ（ｐＩｎｔｅｒｆａｃｅ）を返送する。ステップ１１０１において、このファンクションは、永続的な登録から指定のクラスに対する動的なリンクライブラリーの名前を検索する。ステップ１１０２において、このファンクションは、動的なリンクライブラリーをロードする。ステップ１１０３において、指定のインターフェイスがＩＣｌａｓｓＦａｃｔｏｒｙである場合に、このファンクションはステップ１１０４に続き、さもなくば、復帰となる。ステップ１１０４において、このファンクションは、ファンクションＧｅｔＩＣｌａｓｓＦａｃｔｏｒｙを呼び出し、ＩＣｌａｓｓＦａｃｔｏｒｙインターフェイスに対するポインタを得る。ファンクションＧｅｔＩＣｌａｓｓＦａｃｔｏｒｙは、オブジェクトの開発者によって与えられるのが好ましい。次いで、ファンクションＧｅｔＣｌａｓｓＯｂｊｅｃｔは復帰となる。
【００６２】
オブジェクトの開発者は、オブジェクトに対するカスタムマーシャリング及びアンマーシャリングを行うようにＩＭａｒｓｈａｌインターフェイスを具現化を与えることができる。ＩＭａｒｓｈａｌインターフェイスは、次のように定義される。
【００６３】
【数１１】
0003822541.tif 000012
【００６４】
開発者は、マーシャリングプロセスを最適にするようにカスタムマーシャリングを具現化する。図１２Ａ及び１２Ｂは、インターフェイスポインタのカスタムマーシャリングを示すブロック図である。図１２Ａは標準的なマーシャリングの作用を示す。図１２Ａにおいて、プロセスＰ１のセルオブジェクト１２０１は、セルスタブ１２０２及びセルプロキシー１２０３で表されたようにプロセスＰ２へとマーシャリングされている。セルプロキシー１２０３は、セルスタブ１２０４及びセルプロキシー１２０５で表されたようにプロセスＰ３へとマーシャリングされている。セルプロキシー１２０３は、図７に示す形式の標準的マーシャリングを用いてマーシャリングされたものである。プロセスＰ３がセルプロキシー１２０５のプロキシーメソッドを呼び出すと、このプロキシーメソッドはパラメータをマーシャリングしそしてメッセージをセルスタブ１２０４へ送信する。セルスタブ１２０４は、メッセージを受け取り、パラメータをアンマーシャリングし、そしてセルプロキシー１２０３の適当なプロキシーメソッドを呼び出す。セルプロキシー１２０３のプロキシーメソッドは、パラメータをマーシャリングし、そしてメッセージをセルスタブ１２０２へ送る。このセルスタブ１２０２は、メッセージを受け取り、パラメータをマーシャリングし、そしてセルオブジェクト１２０１の適当なメソッドを呼び出す。このメソッドが復帰すると、セルスタブ１２０２は、出パラメータをマーシャリングし、そしてメッセージをセルプロキシー１２０３へ送る。セルプロキシー１２０３がメッセージを受け取ると、プロキシーメソッドはパラメータをアンマーシャリングし、そしてその発呼者へセルスタブ１２０４を返送する。
【００６５】
セルスタブ１２０４は、出パラメータをマーシャリングし、そしてメッセージをセルプロキシー１２０５へ送る。セルプロキシー１２０５がメッセージを受け取ると、プロキシーメソッドは、パラメータをアンマーシャリングし、そしてその発呼者へ戻す。従って、プロセスＰ３がセルオブジェクト１２０１をアクセスするときに、そのアクセスはプロセスＰ２を経て引き回される。
【００６６】
図１２Ｂはカスタムマーシャリングから得られる最適化を示している。図１２Ｂにおいて、プロセスＰ３がセルオブジェクト１２０１をアクセスするときに、そのアクセスは、プロセスＰ２を経て引き回されず、プロセスＰ１へ直接送られる。この最適化を達成するために、セルプロキシーのＩＭａｒｓｈａｌインターフェイスは、カスタムマーシャリングで実施される。メソッドＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、次の擬似コードによって示すように具現化される。
【００６７】
【数１２】
0003822541.tif 000013
【００６８】
上記のように、標準的ＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、スタブを形成し、そしてスタブのメッセージアドレスを送信する。しかしながら、カスタムのＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、それが通信するスタブのメッセージアドレスを単に送信する。従って、セルプロキシー１２０３のカスタムＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅが呼び出されたときには、セルスタブ１２０２のメッセージアドレスが、アンマーシャリングクラス識別子（ＣｅｌｌＰｒｏｘｙ）と共にプロセスＰ３に送られる。プロセスＰ３は、標準的なアンマーシャリングメソッドを用いてセルプロキシー１２０５を初期化するときに、セルスタブ１２０２のメッセージアドレスを記憶する。従って、プロセスＰ３は、セルオブジェクト１２０１をアクセスするときに、プロセスＰ２をバイパスする。
【００６９】
図１３は、共用メモリでのカスタムマーシャリングを示すブロック図である。ある状態において、オブジェクトは、データメンバーをアクセスするための遠隔手続き呼び出しのオーバーヘッドを回避するために、プロセスにわたって共用されたメモリにデータメンバーを記憶する。図１３において、セルオブジェクト１３０１のデータ１３０２は、共用メモリに記憶される。セルオブジェクト１３０３は、セルオブジェクト１３０１に対するポインタがマーシャリングされてプロセスＰ１からプロセスＰ２へ送られるときに形成される。セルオブジェクトのためのＩＭａｒｓｈａｌインターフェイスのカスタムメソッドは、次の擬似コードによって具現化される。
【００７０】
【数１３】
0003822541.tif 000014
【００７１】
メソッドＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅのパラメータＤｅｓｔＣｏｎｔｅｘｔは、セルオブジェクトのデータが共用メモリに記憶されるかどうか指示する。データが共用メモリに記憶されない場合には、標準的マーシャリングと同等のことが行われる。しかしながら、データが共用メモリに記憶される場合には、共用データのアドレスがメッセージへとマーシャリングされる。メソッドＩＭａｒｓｈａｌ：：ＧｅｔＵｎＭａｒｓｈａｌＣｌａｓｓは、データが共用メモリにあるかどうかに基づいてアンマーシャリングクラスを決定する。データが共用メモリにない場合には、ＣｅｌｌＰｒｏｘｙクラスがアンマーシャリングクラスである。データが共用メモリにある場合には、Ｃｅｌｌクラスがアンマーシャリングクラスである。共用データのアンマーシャリングクラス及びアドレスは、プロセスＰ２に送られる。プロセスＰ２がセルオブジェクト１３０３をインスタンス生成した後に、プロセスＰ２はカスタムメソッドＩＭａｒｓｈａｌ：：ＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅを呼び出し、これは、共用データのアドレスをアンマーシャリングしそしてそのデータを指すようにオブジェクトを初期化する。
【００７２】
カスタムマーシャリングは、不変のオブジェクトを効率的にアクセスするように使用できる。不変のオブジェクトとは、そのデータメンバー（状態）が変更することのないオブジェクトである。不変のオブジェクトに対するインターフェイスオブジェクトがあるプロセスから別のプロセスへパスされたときには、カスタムマーシャリングを行って、他のプロセスにおいてオブジェクトのコピーを形成することができる。従って、他のプロセスがオブジェクトをアクセスするときは、ローカルコピーをアクセスし、プロセス間通信は不要である。不変のオブジェクトをコピーできるようにするために、不変のオブジェクトのＩＭａｒｓｈａｌインターフェイスのメソッドは次のように具現化される。好ましい実施例においては、メソッドＩＭａｒｓｈａｌ：：ＧｅｔＵｎＭａｒｓｈａｌＣｌａｓｓは、アンマーシャリングクラスが不変のオブジェクトのクラスと同じクラスであることを指定する。これは、同じ形式のオブジェクトが他のプロセスによってインスタンス生成されるよう確保する。メソッドＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、不変のオブジェクトのデータメンバーを、他のプロセスへパスするためのメッセージに記憶する。メソッドＩＭａｒｓｈａｌ：：ＭａｒｓｈａｌＩｎｔｅｒｆａｃｅはスタブを形成しない。他のプロセスは、メッセージを受け取ると、不変のオブジェクトのクラスのオブジェクトを形成する。次いで、メソッドＩＭａｒｓｈａｌ：：ＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅは、メッセージからデータメンバーを検索し、そして新たに形成されたオブジェクトを初期化する。次いで、他のプロセスは、不変のオブジェクトをアクセスする。
【００７３】
以上、好ましい実施例について本発明を詳細に説明したが、本発明は、これらの実施例に限定されるものではない。本発明の精神内で変更がなされ得ることが当業者に明らかであろう。本発明の範囲は、以下の請求の範囲のみによって限定されるものとする。
【図面の簡単な説明】
【図１】オブジェクトを表すのに使用される典型的なデータ構造体を示すブロック図である。
【図２】スプレッドシートオブジェクトのサンプルデータ構造体を示すブロック図である。
【図３】マーシャリング及びアンマーシャリング中に発生されるデータ構造体及びロードされるコードを示すブロック図である。
【図４Ａ】インターフェイスポインタのマーシャリング動作を示すブロック図である。
【図４Ｂ】インターフェイスポインタのマーシャリング動作を示すブロック図である。
【図４Ｃ】インターフェイスポインタのマーシャリング動作を示すブロック図である。
【図５】メソッドＧｅｔＣｅｌｌを示す流れ線図である。
【図６】ファンクションＭａｒｓｈａｌＩｎｔｅｒｆａｃｅを示す流れ線図である。
【図７】メソッドＭａｒｓｈａｌＩｎｔｅｒｆａｃｅの具現化例を示す流れ線図である。
【図８】ファンクションＭａｋｅＳｔｕｂの流れ線図である。
【図９】ファンクションＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅの流れ線図である。
【図１０】ＩＭａｒｓｈａｌインターフェイスのメソッドＵｎＭａｒｓｈａｌＩｎｔｅｒｆａｃｅの具現化例を示す流れ線図である。
【図１１】ファンクションＧｅｔＣｌａｓｓＯｂｊｅｃｔの流れ線図である。
【図１２Ａ】プロキシー対プロキシーメッセージを回避するためのカスタムマーシャリングを示すブロック図である。
【図１２Ｂ】プロキシー対プロキシーメッセージを回避するためのカスタムマーシャリングを示すブロック図である。
【図１３】共用メモリでのカスタムマーシャリングを示すブロック図である。
【符号の説明】
１０１、２０３、２０６  インスタンスデータ構造体
１０２、２０４、２０７  仮想ファンクションテーブル
１０３、１０４、１０５  ファンクションメンバー
２０１  インターフェイスデータ構造体
２０２  ＩＢａｓｉｃインターフェイスデータ構造体
２０５  ＩＤａｔａｂａｓｅインターフェイスデータ構造体
３０１  オブジェクト
３０２  スタブオブジェクト
３０３  プロキシーオブジェクト
【図１】
0003822541.tif 000015
【図２】
0003822541.tif 000016
【図３】
0003822541.tif 000017
【図４Ａ】
0003822541.tif 000018
【図４Ｂ】
0003822541.tif 000019
【図４Ｃ】
0003822541.tif 000020
【図５】
0003822541.tif 000021
【図６】
0003822541.tif 000022
【図７】
0003822541.tif 000023
【図８】
0003822541.tif 000024
【図９】
0003822541.tif 000025
【図１０】
0003822541.tif 000026
【図１１】
0003822541.tif 000027
【図１２Ａ】
0003822541.tif 000028
【図１２Ｂ】
0003822541.tif 000029
【図１３】
0003822541.tif 000030