データのマーシャリング

提供: RAD Studio
移動先: 案内検索

単純な COM サーバーの作成:インデックス への移動

アウトオブプロセスサーバーとリモートサーバーについては,COM が現在のプロセスの外にあるデータをどのようにマーシャリングするかを考慮する必要があります。マーシャリングは以下の方法で提供できます。

  • IDispatch インターフェースを使用することによって自動的に実行します。
  • サーバーにタイプライブラリを作成し,インターフェースに OLE Automation フラグを付けることによって自動的に実行します。COM はタイプライブラリ内のすべてのオートメーション互換型をマーシャリングすることができ,プロキシとスタブを自動的にセットアップします。自動マーシャリングを有効にするために,型に関するいくつかの制約が適用されます。
  • IMarshal インターフェースのすべてのメソッドを実装することによって手動で実行します。これはカスタムマーシャリングと呼ばれます。

メモ:  最初の方法(IDispatch を使用する方法)は,オートメーションサーバー上でしか使用できません。ウィザードで作成され,かつタイプライブラリを使用するオブジェクトであれば,すべて自動的に 2 番めの方法を使用できます。

オートメーション互換型

デュアルインターフェース,ディスパッチインターフェース,および OLE Automation のマークを付けたインターフェースの中で宣言されるメソッドの関数の結果とパラメータの型は,オートメーション互換型の必要があります。以下の型は OLE オートメーション互換です。

第 1 に,SmallintIntegerSingleDoubleWideString などの定義済みの有効な型。完全なリストについては,「有効な型」を参照。

第 2 に,タイプライブラリの中で定義された列挙型。OLE オートメーション互換の列挙型は 32 ビット値として保存され,パラメータとして渡す目的で Integer 型の値として取り扱われる。

第 3 に,タイプライブラリの中で OLE オートメーションが安全であると定義されているインターフェース型。つまり,IDispatch から派生して OLE オートメーション互換型だけを含んでいるもの。

第 4 に,タイプライブラリの中で定義されたディスパッチインターフェース型。

第 5 に,タイプライブラリの中で定義されたカスタムのレコード型。

第 6 に,IFontIStrings,および IPicture。以下のマッピングを実行するためにヘルパーオブジェクトをインスタンス化しなければならない。

  • IFontTFont
  • IStringsTStrings
  • IPictureTPicture

ActiveX コントロールウィザードと Active フォームウィザードは,必要なときにこれらのヘルパーオブジェクトを自動的に作成します。これらのヘルパーオブジェクトを使用するには,それぞれグローバルルーチン GetOleFont,GetOleStrings,GetOlePicture を呼び出します。

自動マーシャリングのための型の制約

インターフェースが自動マーシャリング(オートメーションマーシャリング,タイプライブラリマーシャリングとも呼ばれる)をサポートするためには,以下の制約が適用されます。タイプライブラリエディタを使ってオブジェクトを編集すると,エディタがこれらの制約を強制します。

  • 文字列データ型は,ワイド文字列(BSTR)として転送しなければなりません。PChar UnicodeStringAnsiString は,安全にマーシャリングすることはできません。
  • デュアルインターフェースのすべてのメンバーは関数の戻り値として HRESULT を渡さなければなりません。safecall の呼び出し規約でメソッドを宣言した場合,この条件が自動的に適用されて,宣言した戻り値の型が出力パラメータに変換されます。
  • ほかの値を返す必要があるデュアルインターフェースのメンバーは,それらのパラメータを var または out と指定して,関数値を返す出力パラメータであることを示さなければなりません。

メモ:  オートメーションの型の制約を回避するには,IDispatch インターフェースとカスタムインターフェースを別々に実装するという方法があります。それにより,すべての引数の型を使用できるようになります。この場合,COM クライアントはカスタムインターフェースを使用することができ,オートメーションコントローラは引き続きカスタムインターフェースにアクセスできます。ただし,マーシャリングコードを手動で実装する必要があります。

カスタムマーシャリング

一般に,アウトオブプロセスサーバーとリモートサーバーでは自動マーシャリングを使用します。COM が自動的に作業を実行してくれるので,簡単なためです。ただし,カスタムマーシャリングの方がマーシャリングの処理効率を上げられると判断した場合は,カスタムマーシャリングを提供することもできます。独自のカスタムマーシャリングを実装する場合は,IMarshal インターフェースをサポートしなければなりません。この方法の詳細は,Microsoft の資料を参照してください。

関連項目