CoReleaseMarshalData 関数 (combaseapi.h)

以前にマーシャリングされたデータ パケットを破棄します。

構文

HRESULT CoReleaseMarshalData(
  [in] LPSTREAM pStm
);

パラメーター

[in] pStm

破棄されるデータ パケットを含むストリームへのポインター。 「IStream」を参照してください。

戻り値

この関数は、E_FAIL、E_INVALIDARG、E_OUTOFMEMORY、E_UNEXPECTEDの標準戻り値と、次の値を返すことができます。

リターン コード 説明
S_OK
データ パケットが正常に破棄されました。
STG_E_INVALIDPOINTER
pStm パラメーターに関連するエラー。
CO_E_NOTINITIALIZED
CoInitialize 関数または OleInitialize 関数は、この関数が呼び出される前に、現在のスレッドで呼び出されませんでした。

注釈

重要  

セキュリティに関する注意: 信頼されていないデータを使用してこのメソッドを呼び出すと、セキュリティ上のリスクがあります。 このメソッドは信頼されたデータでのみ呼び出してください。

 
CoReleaseMarshalData 関数は、次のタスクを実行します。
  1. 関数は、ストリームから CLSID を読み取ります。
  2. COM の既定のマーシャリング実装が使用されている場合、関数は標準の unmarshaler のインスタンスへの IMarshal ポインターを取得します。 カスタム マーシャリングを使用している場合、 関数は CoCreateInstance 関数を呼び出してプロキシを作成し、ストリームから読み取った CLSID を渡し、新しく作成されたプロキシへの IMarshal インターフェイス ポインターを要求します。
  3. 取得した IMarshal インターフェイス ポインターを使用して、関数は IMarshal::ReleaseMarshalData を呼び出します。
通常、この関数は呼び出しません。 この関数を呼び出す必要がある唯一の状況は、カスタム マーシャリングを使用する場合です ( IMarshal の独自の実装を記述して使用します)。 CoReleaseMarshalData を呼び出す必要がある場合の例を次に示します。
  • データ パケットのマーシャリングを解除しようとしましたが、失敗しました。
  • マーシャリングされたデータ パケットがグローバル テーブルから削除されました。
たとえば、データ パケットは、オブジェクトに保持されている別のインターフェイス ポインターであるかのように、元のオブジェクトへの参照と考えることができます。 実際のインターフェイス ポインターと同様に、そのデータ パケットは、ある時点で解放する必要があります。 IMarshal::ReleaseMarshalData を使用してデータ パケットを解放することは、IUnknown::Release を使用してインターフェイス ポインターを解放するのと似ています。

CoUnmarshalInterface 関数の呼び出しが成功した後、CoReleaseMarshalData を呼び出す必要はありません。その関数は、マーシャリング データを処理の一部として解放します。

大事なCoMarshalInterface を呼び出したのと同じアパートメントで CoReleaseMarshalData 関数を呼び出して、オブジェクトをストリームにマーシャリングする必要があります。 これを行わないと、ストリーム内のマーシャリングされたパケットによって保持されているオブジェクト参照がリークされる可能性があります。
 

要件

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

こちらもご覧ください

IMarshal::ReleaseMarshalData