データのマーシャリング
プロセス外サーバーやリモート サーバーの場合、COM がどのように現行プロセス外のデータをマーシャリングするか、検討する必要があります。次のようにマーシャリングを提供することができます:
- IDispatch インターフェイスを使用して、自動で行います。
- タイプ ライブラリをサーバーで、インターフェイスを OLE オートメーション フラグで作成して、自動で行います。COMは、タイプ ライブラリ内のオートメーション互換型はすべてマーシャリングする方法を知っており、プロパティとスタブを設定することができます。自動マーシャリングを有効にするために、型制限が場合により適用されます。
- IMarshal インターフェイスのすべてのメソッドを実装することで、手動で行います。これを カスタム マーシャリングと呼びます。
メモ: 最初のメソッド(IDispatch を使用)は、オートメーション サーバーにのみ適用されます。2 番目のメソッドは、ウィザードによって作成され、タイプ ライブラリを使用するすべてのオブジェクトに対して、自動的に利用可能となります。
オートメーション互換型
デュアル インターフェイスまたはディスパッチ インターフェイスで宣言された関数の結果とメソッドのパラメータ型、および、OLD オートメーションとした記したインターフェイスは、オートメーション互換型でなければなりません。次の型が OLE オートメーション互換です:
まずは、事前定義された有効型で、Smallint、Integer、Single、Double、WideString など。完全なリストについては、「有効な型」を参照してください。
2 つ目に、タイプ ライブラリで定義された列挙型。OLE オートメーション互換列挙型は、32 ビット値に格納され、パラメータを受け渡す用途のために、Integer 型の値として扱われます。
3 つ目に、OLD オートメーション セーフである(つまり、IDispatch から派生し、OLE オートメーション互換型のみを格納している)、タイプ ライブラリで定義されたインターフェイス型。
4 つ目に、タイプ ライブラリで定義された dispinterface 型。
5 つ目に、タイプ ライブラリで定義されたカスタム レコード型。
6 つ目に、IFont、IStrings、IPicture。ヘルパ オブジェクトは、次をマッピングするためにインスタンス化しなければなりません。
- IFont を TFont に
- IStrings を TStrings に
- IPicture を TPicture に
ActiveX コントロールと ActiveForm ウィザードは、必要に応じてこれらのヘルパ オブジェクトを作成します。ヘルパ オブジェクトを使用するには、グローバル ルーチンである GetOleFont、GetOleStrings、GetOlePicture、をそれぞれ呼び出します。
自動マーシャリングのための型制限
自動マーシャリング(または、オートメーション マーシャリング、もしくはタイプ ライブラリ マーシャリングと呼ばれる)をサポートするためのインターフェイスには、次の制限が適用されます:タイプ ライブラリ エディタを使用してオブジェクトを編集する場合、エディタはこれらの制限を強制的に適用します:
- 文字列データ型は、ワイド文字列(BSTR)として変更されなければなりません。PChar、UnicodeString、AnsiString は、安全にマーシャリングはされません。
- デュアル インターフェイスのメンバはすべて、HRESULT を関数の戻り値として渡さなければなりません。メソッドが、safecall 呼び出し変換を使用して宣言されている場合、この条件は自動的に適用され、宣言された戻り値型は出力パラメータに変換されます。
- 他の値を返す必要のあるデュアル インターフェイスのメンバーは、これらのパラメータを var または out として指定して、関数の値を返す出力パラメータを指定しなければなりません。
メモ: オートメーションの型宣言を回避する 1 つの方法は、別に IDispatch インターフェイスとカスタム インターフェイスを実装することです。これを行うことにより、利用可能なすべての引数型を使用することができます。つまり、COM クライアントは、オートメーション コントローラがアクセスできる、カスタム インターフェイスを使用するオプションを持っている、ということです。ただしこの場合、マーシャリング コードも手動で実装しなければなりません。
カスタム マーシャリング
大抵の場合、プロセス外サーバーおよびリモート サーバーでは、自動マーシャリングを使用します。これは、その方が簡単だから - COM があなたのために作業をしてくれるから - です。しかしながら、自分でマーシャリング パフォーマンスを向上させられると考え、独自のマーシャリングを用意しようと決断する場合もあるでしょう。独自のカスタム マーシャリングを実装する際には、IMarshal インターフェイスをサポートしなければなりません。このアプローチについての詳細については、Microsoft のドキュメントを参照してください。