coUnmarshalInterface 函数 (combaseapi.h)

使用先前调用 CoMarshalInterface 函数写入流的数据初始化新创建的代理,并返回指向该代理的接口指针。

语法

HRESULT CoUnmarshalInterface(
  [in]  LPSTREAM pStm,
  [in]  REFIID   riid,
  [out] LPVOID   *ppv
);

参数

[in] pStm

指向要从中取消封送接口的流的指针。

[in] riid

对要取消封送的接口标识符的引用。 对于 IID_NULL,返回的接口是由流 objref.iid 定义的接口。

[out] ppv

接收 riid 中请求的接口指针的指针变量的地址。 成功返回后,*ppv 包含未封送接口的请求接口指针。

返回值

此函数可以返回标准返回值E_FAIL、 CoCreateInstance 返回的错误以及以下值。

返回代码 说明
S_OK
已成功取消对接口指针的封送。
STG_E_INVALIDPOINTER
pStm 是无效的指针。
CO_E_NOTINITIALIZED
在调用此函数之前,未在当前线程上调用 CoInitializeOleInitialize 函数。
CO_E_OBJNOTCONNECTED
例如,由于调用 CoDisconnectObject 函数) ,对象应用程序已与远程处理系统断开连接 (。
REGDB_E_CLASSNOTREG
读取注册数据库时出错。
E_NOINTERFACE
请求的接口的此函数的最终 QueryInterface 返回E_NOINTERFACE。

注解

重要说明  

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

 
CoUnmarshalInterface 函数执行以下任务:
  1. 从流中读取用于创建代理实例的 CLSID。
  2. 获取一个 IMarshal 指针,该指针指向要执行取消封送的代理。 如果对象使用 COM 的默认封送处理实现,则获取的指针指向泛型代理对象的实例。 如果封送处理发生在同一进程中的两个线程之间,则指针指向进程内自由线程封送处理程序的实例。 如果对象提供其自己的封送代码, CoUnmarshalInterface 将调用 CoCreateInstance 函数,传递它从封送处理流中读取的 CLSID。 CoCreateInstance 创建对象的代理实例,并返回指向代理的 IMarshal 接口指针。
  3. 使用该函数获取的 IMarshal 接口指针,然后调用 IMarshal::UnmarshalInterface ,如果适用, 则调用 IMarshal::ReleaseMarshalData
此函数的主要调用方是 COM 本身,来自取消封送接口指针的接口代理或存根。 但是,在某些情况下,你可能会调用 CoUnmarshalInterface。 例如,如果要实现存根,则当存根接收接口指针作为方法调用中的参数时,实现将调用 CoUnmarshalInterface

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 combaseapi.h (包括 Objbase.h)
Library Ole32.lib
DLL Ole32.dll

另请参阅

CoMarshalInterface

IMarshal::UnmarshalInterface