マーシャリング機構
COM の基礎:インデックス への移動
マーシャリングは,クライアントが別のプロセスまたは別のマシンにあるリモートオブジェクトに対してインターフェース関数呼び出しを実行できるようにする機構です。マーシャリングは,以下のように機能します。
- サーバーのプロセスからインターフェースポインタをとり,クライアントプロセスのコードがプロキシポインタを利用できるようにします。
- インターフェース呼び出しの引数をクライアントから渡されたとおりに転送し,その引数をリモートオブジェクトのプロセス空間に入れます。
どのようなインターフェース呼び出しでも,クライアントは引数をスタックにプッシュし,インターフェースポインタを介して関数呼び出しを実行します。オブジェクトへの呼び出しがインプロセスでない場合,その呼び出しはプロキシに渡されます。プロキシは引数をマーシャリングパケットにパックし,その構造体をリモートオブジェクトへ送信します。オブジェクトのスタブはパケットをアンパックし,引数をスタックにプッシュして,オブジェクトの実装を呼び出します。基本的に,オブジェクトはクライアントの呼び出しを自分自身のアドレス空間内に再作成します。
発生するマーシャリングの種類は,COM オブジェクトが何を実装するインターフェースかによって決まります。オブジェクトは,IDispatch インターフェースが提供する標準マーシャリング機構を使用することができます。これは,システム標準リモート手続き呼び出し(RPC)を介した通信を可能にする,一般的なマーシャリング機構です。IDispatch インターフェースについての詳細は,「オートメーションインターフェース」を参照してください。オブジェクトが IDispatch を実装しない場合でも,オブジェクトが自分自身をオートメーション互換型に制限し,登録されたタイプライブラリを持つ場合は,COM は自動的にマーシャリングのサポートを提供します。
アプリケーションが自分自身をオートメーション互換型に制限せず,タイプライブラリも登録していない場合は,独自のマーシャリングを提供しなければなりません。マーシャリングを提供するには,IMarshal インターフェースを実装するか,別途生成したプロキシ/スタブ DLL を使用します。Delphi は,プロキシ/スタブ DLL の自動生成をサポートしていません。