データのマーシャリング
アウトオブプロセスサーバーとリモートサーバーについては,COM が現在のプロセスの外にあるデータをどのようにマーシャリングするかを考慮する必要があります。マーシャリングは以下の方法で提供できます。
- IDispatch インターフェースを使用することによって自動的に実行します。
- サーバーにタイプライブラリを作成し,インターフェースに OLE Automation フラグを付けることによって自動的に実行します。COM はタイプライブラリ内のすべてのオートメーション互換型をマーシャリングすることができ,プロキシとスタブを自動的にセットアップします。自動マーシャリングを有効にするために,型に関するいくつかの制約が適用されます。
- IMarshal インターフェースのすべてのメソッドを実装することによって手動で実行します。これはカスタムマーシャリングと呼ばれます。
メモ: 最初の方法(IDispatch を使用する方法)は,オートメーションサーバー上でしか使用できません。ウィザードで作成され,かつタイプライブラリを使用するオブジェクトであれば,すべて自動的に 2 番めの方法を使用できます。
オートメーション互換型
デュアルインターフェース,ディスパッチインターフェース,および OLE Automation のマークを付けたインターフェースの中で宣言されるメソッドの関数の結果とパラメータの型は,オートメーション互換型の必要があります。以下の型は OLE オートメーション互換です。
第 1 に,Smallint,Integer,Single,Double,WideString などの定義済みの有効な型。完全なリストについては,「有効な型」を参照。
第 2 に,タイプライブラリの中で定義された列挙型。OLE オートメーション互換の列挙型は 32 ビット値として保存され,パラメータとして渡す目的で Integer 型の値として取り扱われる。
第 3 に,タイプライブラリの中で OLE オートメーションが安全であると定義されているインターフェース型。つまり,IDispatch から派生して OLE オートメーション互換型だけを含んでいるもの。
第 4 に,タイプライブラリの中で定義されたディスパッチインターフェース型。
第 5 に,タイプライブラリの中で定義されたカスタムのレコード型。
第 6 に,IFont,IStrings,および IPicture。以下のマッピングを実行するためにヘルパーオブジェクトをインスタンス化しなければならない。
- IFont を TFont に
- IStrings を TStrings に
- IPicture を TPicture に
ActiveX コントロールウィザードと Active フォームウィザードは,必要なときにこれらのヘルパーオブジェクトを自動的に作成します。これらのヘルパーオブジェクトを使用するには,それぞれグローバルルーチン GetOleFont,GetOleStrings,GetOlePicture を呼び出します。
自動マーシャリングのための型の制約
インターフェースが自動マーシャリング(オートメーションマーシャリング,タイプライブラリマーシャリングとも呼ばれる)をサポートするためには,以下の制約が適用されます。タイプライブラリエディタを使ってオブジェクトを編集すると,エディタがこれらの制約を強制します。
- 文字列データ型は,ワイド文字列(BSTR)として転送しなければなりません。PChar UnicodeString と AnsiString は,安全にマーシャリングすることはできません。
- デュアルインターフェースのすべてのメンバーは関数の戻り値として HRESULT を渡さなければなりません。safecall の呼び出し規約でメソッドを宣言した場合,この条件が自動的に適用されて,宣言した戻り値の型が出力パラメータに変換されます。
- ほかの値を返す必要があるデュアルインターフェースのメンバーは,それらのパラメータを var または out と指定して,関数値を返す出力パラメータであることを示さなければなりません。
メモ: オートメーションの型の制約を回避するには,IDispatch インターフェースとカスタムインターフェースを別々に実装するという方法があります。それにより,すべての引数の型を使用できるようになります。この場合,COM クライアントはカスタムインターフェースを使用することができ,オートメーションコントローラは引き続きカスタムインターフェースにアクセスできます。ただし,マーシャリングコードを手動で実装する必要があります。
カスタムマーシャリング
一般に,アウトオブプロセスサーバーとリモートサーバーでは自動マーシャリングを使用します。COM が自動的に作業を実行してくれるので,簡単なためです。ただし,カスタムマーシャリングの方がマーシャリングの処理効率を上げられると判断した場合は,カスタムマーシャリングを提供することもできます。独自のカスタムマーシャリングを実装する場合は,IMarshal インターフェースをサポートしなければなりません。この方法の詳細は,Microsoft の資料を参照してください。