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

注解

CoMarshalInterface 函数封送 pUnk 指向其 IUnknown 实现的对象上的 riid 所引用的接口。 为此, CoMarshalInterface 函数执行以下任务:

  1. 在 对象中查询指向 IMarshal 接口的 指针。 如果对象未实现 IMarshal,这意味着它依赖于 COM 提供封送支持, 则 CoMarshalInterface 将获取指向 COM 默认实现 IMarshal 的指针。
  2. 使用已返回的 IMarshal 接口指针,通过调用 IMarshal::GetUnmarshalClass 获取对象的代理 的 CLSID
  3. 将代理的 CLSID 写入要用于封送处理的流。
  4. 通过调用 IMarshal::MarshalInterface 封送接口指针。
客户端进程中的 COM 库调用 CoUnmarshalInterface 函数来提取数据并初始化代理。 在调用 CoUnmarshalInterface 之前,请回溯到流中的原始位置。

如果要实现现有 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

另请参阅

CoUnmarshalInterface

IMarshal::MarshalInterface