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 返回的流访问错误值以及以下值。
返回代码 | 说明 |
---|---|
|
HRESULT 已成功封送。 |
|
在调用此函数之前,在当前线程上未调用 CoInitialize 或 OleInitialize 函数。 |
注解
CoMarshalInterface 函数封送 pUnk 指向其 IUnknown 实现的对象上的 riid 所引用的接口。 为此, CoMarshalInterface 函数执行以下任务:
- 在 对象中查询指向 IMarshal 接口的 指针。 如果对象未实现 IMarshal,这意味着它依赖于 COM 提供封送支持, 则 CoMarshalInterface 将获取指向 COM 默认实现 IMarshal 的指针。
- 使用已返回的 IMarshal 接口指针,通过调用 IMarshal::GetUnmarshalClass 获取对象的代理 的 CLSID 。
- 将代理的 CLSID 写入要用于封送处理的流。
- 通过调用 IMarshal::MarshalInterface 封送接口指针。
如果要实现现有 COM 接口或使用 Microsoft 接口定义语言 (MIDL) 定义自己的接口,则 MIDL 生成的代理和存根会为你调用 CoMarshalInterface 。 如果要编写自己的代理和存根,则代理代码和存根代码应分别调用 CoMarshalInterface 以正确封送接口指针。 不建议直接从代理和存根代码调用 IMarshal 。
如果要编写自己的 IMarshal 实现,并且代理需要访问专用对象,则可以将指向该对象的接口指针包含在写入流的数据中。 在这种情况下,如果要在传递接口指针时使用 COM 的默认封送实现,可以在 对象上调用 CoMarshalInterface 来执行此操作。
要求
最低受支持的客户端 | Windows 2000 专业版 [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows 2000 Server [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | combaseapi.h (包括 Objbase.h) |
Library | Ole32.lib |
DLL | Ole32.dll |