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

このセクションでは、インターフェイス設計のルールとガイドラインの概要を説明します。 これらのルールの一部は COM アーキテクチャに固有ですが、その他はインターフェイス設計言語 MIDL によって課される制限です。 COM インターフェイスの設計の詳細については、「IDL ファイルの構造」を参照してください。

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

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

Note

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

 

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

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

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

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

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

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

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

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