次の方法で共有


インターフェイスデザインルール

このセクションでは、インターフェイスの設計規則とガイドラインの概要を示します。 これらの規則の中には COM アーキテクチャに固有のものもあれば、インターフェイスデザイン言語 MIDL によって課せられる制限もあります。 COM インターフェイスの設計の詳細については、IDL ファイルの構造を参照してください。

定義上、オブジェクトは、IUnknown インターフェイスまたは IUnknown から派生したインターフェイス実装しない限り、COM オブジェクトではありません。 さらに、COM オブジェクトに実装されているすべてのインターフェイスに次の規則が適用されます。

  • 一意のインターフェイス識別子 (IID) が必要です。
  • これらは不変である必要があります。 作成して公開すると、定義の一部は変更されません。
  • すべてのインターフェイス メソッドは、リモート処理を処理するシステムの部分が RPC エラーを報告できるように、HRESULT 値を返す必要があります。
  • インターフェイス メソッド内のすべての文字列パラメーターは Unicode である必要があります。
  • データ型はリモート可能である必要があります。 データ型をリモート可能な型に変換できない場合は、独自のマーシャリングおよびマーシャリング解除ルーチンを作成する必要があります。 また、LPVOID (または void * )は、リモート コンピューターでは意味がありません。 必要に応じて、IUnknownへのポインターを使用します。

手記

MIDL の現在の実装では、関数のオーバーロードや複数の継承は処理されません。

 

その他のインターフェイス設計に関する考慮事項

データへのポインターは非常に慎重に使用してください。 呼び出されるプロセスのアドレス空間にデータを再作成するには、RPC ランタイムがデータの正確なサイズを認識している必要があります。 たとえば、CHAR * パラメーターが 1 文字ではなく文字のバッファーを指している場合、データを正しく再作成できません。 MIDL で使用できる構文を使用して、型定義で表されるデータ構造を正確に記述します。

初期化は、配列と構造体に埋め込まれており、プロセスの境界を越えて渡されるポインターに不可欠です。 初期化されていないポインターは、同じプロセス空間内のプログラムに渡されると機能しますが、プロキシとスタブでは、すべてのポインターが有効なアドレスで初期化されているか、null であると想定されます。

ポインターの別名を設定するときは注意してください (ポインターが同じメモリ部分を指すようにします)。 エイリアシングが意図的な場合は、IDL ファイルでこれらのポインターをエイリアス化して宣言する必要があります。 非エイリアスとして宣言されたポインターは、互いにエイリアスを設定しないでください。

メモリを割り当てて解放する方法に注意してください。 アウトプロセス呼び出し中に作成されたデータ構造を解放しないように( 属性を使用して) COM オブジェクトに明示的に指示しない限り、呼び出しが完了すると、その構造体は破棄されることに注意してください。 また、マーシャリングとマーシャリングを行う必要があるデータ構造の非効率的な割り当てによって生じる破壊的オーバーヘッドの可能性を考慮してください。

最後に、HRESULT 戻り値を定義する場合は、COM 定義のFACILITY_ITF コード (0x0000 と0x01FFの間の値が予約済み) または同じ値を持つ他の HRESULT 値と競合するエラー コードを作成しないように注意してください。 可能な限り、汎用 COM の成功と失敗の戻り値を使用し、HRESULTではなく、out パラメーターを使用して、関数呼び出しに固有の情報を返します。

詳細については、次のトピックを参照してください。

  • リモート処理可能なインターフェイスの設計
  • COM インターフェイス を使用する

インターフェイス定義とタイプ ライブラリ