次の方法で共有


CoMarshalInterface 関数 (combaseapi.h)

一部のクライアント プロセスでプロキシ オブジェクトを初期化するために必要なデータをストリームに書き込みます。

構文

HRESULT CoMarshalInterface(
  [in]           LPSTREAM  pStm,
  [in]           REFIID    riid,
  [in]           LPUNKNOWN pUnk,
  [in]           DWORD     dwDestContext,
  [in, optional] LPVOID    pvDestContext,
  [in]           DWORD     mshlflags
);

パラメーター

[in] pStm

マーシャリング中に使用されるストリームへのポインター。 「IStream」を参照してください。

[in] riid

マーシャリングするインターフェイスの識別子への参照。 このインターフェイスは、 IUnknown インターフェイスから派生する必要があります。

[in] pUnk

マーシャリングするインターフェイスへのポインター。 このインターフェイスは、 IUnknown インターフェイスから派生する必要があります。

[in] dwDestContext

指定したインターフェイスをマーシャリングしない宛先コンテキスト。 指定できる値は、列挙 MSHCTX から取得されます。 現在、非マーシャリングは、現在のプロセス (MSHCTX_INPROC) の別のアパートメント、現在のプロセス (MSHCTX_LOCAL) と同じコンピューター上の別のプロセス、または別のコンピューター (MSHCTX_DIFFERENTMACHINE) 上のプロセスで発生する可能性があります。

[in, optional] pvDestContext

このパラメーターは予約済みであり、 NULL である必要があります。

[in] mshlflags

マーシャリングするデータをクライアント プロセスに返送するか (一般的な場合)、グローバル テーブルに書き込むかを指定するフラグ。このフラグは、複数のクライアントで取得できます。 指定できる値は 、MSHLFLAGS 列挙体から取得されます。

戻り値

この関数は、標準の戻り値E_FAIL、E_OUTOFMEMORY、およびE_UNEXPECTED、 IStream によって返されるストリーム アクセス エラー値、および次の値を返すことができます。

リターン コード 説明
S_OK
HRESULT は正常にマーシャリングされました。
CO_E_NOTINITIALIZED
この関数が呼び出される前に、現在のスレッドで CoInitialize または OleInitialize 関数が呼び出されませんでした。

解説

CoMarshalInterface 関数は、iUnknown 実装が pUnk によって指されているオブジェクトの riid によって参照されるインターフェイスをマーシャリングします。 これを行うには、 CoMarshalInterface 関数は次のタスクを実行します。

  1. オブジェクトに対して 、IMarshal インターフェイスへのポインターを照会します。 オブジェクトが IMarshal を実装していない場合(つまり、マーシャリングのサポートを提供するために COM に依存している)、 CoMarshalInterface は COM の IMarshal の既定の実装へのポインターを取得します。
  2. IMarshal::GetUnmarshalClass を呼び出して、返された IMarshal インターフェイス ポインターを使用して、オブジェクトのプロキシの CLSID を取得します。
  3. マーシャリングに使用するストリームにプロキシの CLSID を書き込みます。
  4. IMarshal::MarshalInterface を呼び出してインターフェイス ポインターをマーシャリングします。
クライアント プロセスの COM ライブラリは 、CoUnmarshalInterface 関数を呼び出してデータを抽出し、プロキシを初期化します。 CoUnmarshalInterface を呼び出す前に、ストリーム内の元の位置に戻ります。

既存の COM インターフェイスを実装する場合、または Microsoft Interface Definition Language (MIDL) を使用して独自のインターフェイスを定義する場合、MIDL によって生成されたプロキシとスタブは CoMarshalInterface を呼び出します。 独自のプロキシとスタブを記述する場合、プロキシ コードとスタブ コードは、それぞれ CoMarshalInterface を呼び出してインターフェイス ポインターを正しくマーシャリングする必要があります。 プロキシとスタブ コードから IMarshal を直接呼び出すことはお勧めしません。

IMarshal の独自の実装を記述していて、プロキシがプライベート オブジェクトにアクセスする必要がある場合は、ストリームに書き込むデータの一部として、そのオブジェクトへのインターフェイス ポインターを含めることができます。 このような状況では、インターフェイス ポインターを渡すときに COM の既定のマーシャリング実装を使用する場合は、オブジェクトで CoMarshalInterface を呼び出してこれを行うことができます。

要件

   
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリ |UWP アプリ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリ |UWP アプリ]
対象プラットフォーム Windows
ヘッダー combaseapi.h (Objbase.h を含む)
Library Ole32.lib
[DLL] Ole32.dll

関連項目

CoUnmarshalInterface

IMarshal::MarshalInterface