データのマーシャリング

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

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


プロセス外サーバーやリモート サーバーの場合、COM がどのように現行プロセス外のデータをマーシャリングするか、検討する必要があります。次のようにマーシャリングを提供することができます:

  • IDispatch インターフェイスを使用して、自動で行います。
  • タイプ ライブラリをサーバーで、インターフェイスを OLE オートメーション フラグで作成して、自動で行います。COMは、タイプ ライブラリ内のオートメーション互換型はすべてマーシャリングする方法を知っており、プロパティとスタブを設定することができます。自動マーシャリングを有効にするために、型制限が場合により適用されます。
  • IMarshal インターフェイスのすべてのメソッドを実装することで、手動で行います。これを カスタム マーシャリングと呼びます。

メモ: 最初のメソッド(IDispatch を使用)は、オートメーション サーバーにのみ適用されます。2 番目のメソッドは、ウィザードによって作成され、タイプ ライブラリを使用するすべてのオブジェクトに対して、自動的に利用可能となります。

オートメーション互換型

デュアル インターフェイスまたはディスパッチ インターフェイスで宣言された関数の結果とメソッドのパラメータ型、および、OLD オートメーションとした記したインターフェイスは、オートメーション互換型でなければなりません。次の型が OLE オートメーション互換です:

まずは、事前定義された有効型で、SmallintIntegerSingleDoubleWideString など。完全なリストについては、「有効な型」を参照してください。

2 つ目に、タイプ ライブラリで定義された列挙型。OLE オートメーション互換列挙型は、32 ビット値に格納され、パラメータを受け渡す用途のために、Integer 型の値として扱われます。

3 つ目に、OLD オートメーション セーフである(つまり、IDispatch から派生し、OLE オートメーション互換型のみを格納している)、タイプ ライブラリで定義されたインターフェイス型。

4 つ目に、タイプ ライブラリで定義された dispinterface 型。

5 つ目に、タイプ ライブラリで定義されたカスタム レコード型。

6 つ目に、IFontIStringsIPicture。ヘルパ オブジェクトは、次をマッピングするためにインスタンス化しなければなりません。

  • IFontTFont
  • IStringsTStrings
  • IPictureTPicture

ActiveX コントロールと ActiveForm ウィザードは、必要に応じてこれらのヘルパ オブジェクトを作成します。ヘルパ オブジェクトを使用するには、グローバル ルーチンである GetOleFont、GetOleStrings、GetOlePicture、をそれぞれ呼び出します。

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

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

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

メモ: オートメーションの型宣言を回避する 1 つの方法は、別に IDispatch インターフェイスとカスタム インターフェイスを実装することです。これを行うことにより、利用可能なすべての引数型を使用することができます。つまり、COM クライアントは、オートメーション コントローラがアクセスできる、カスタム インターフェイスを使用するオプションを持っている、ということです。ただしこの場合、マーシャリング コードも手動で実装しなければなりません。

カスタム マーシャリング

大抵の場合、プロセス外サーバーおよびリモート サーバーでは、自動マーシャリングを使用します。これは、その方が簡単だから - COM があなたのために作業をしてくれるから - です。しかしながら、自分でマーシャリング パフォーマンスを向上させられると考え、独自のマーシャリングを用意しようと決断する場合もあるでしょう。独自のカスタム マーシャリングを実装する際には、IMarshal インターフェイスをサポートしなければなりません。このアプローチについての詳細については、Microsoft のドキュメントを参照してください。

関連項目