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
在调用此函数之前,未在当前线程上调用 CoInitializeOleInitialize 函数。

注解

重要说明  

安全说明:使用不受信任的数据调用此方法存在安全风险。 仅使用受信任的数据调用此方法。

 
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 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 combaseapi.h (包括 Objbase.h)
Library Ole32.lib
DLL Ole32.dll

另请参阅

IMarshal::ReleaseMarshalData