CoCreateFreeThreadedMarshaler 函数 (combaseapi.h)

创建能够进行上下文相关封送处理的可聚合对象。

语法

HRESULT CoCreateFreeThreadedMarshaler(
  [in]  LPUNKNOWN punkOuter,
  [out] LPUNKNOWN *ppunkMarshal
);

参数

[in] punkOuter

指向聚合对象的控制 IUnknown 的指针。

[out] ppunkMarshal

接收指向可聚合封送处理程序的接口指针的指针变量的地址。

返回值

此函数可以返回E_OUTOFMEMORY的标准返回值,以及以下值。

返回代码 说明
S_OK
已创建封送处理程序。

注解

CoCreateFreeThreadedMarshaler 函数使对象能够有效地封送同一进程中线程之间的接口指针。 如果对象不支持线程间封送处理,则无需调用此函数。 它旨在供自由线程 DLL 服务器使用,这些服务器必须由进程中的所有线程直接访问,甚至那些与单线程单元关联的线程。 它将实际内存指针作为虚假的“代理”自定义封送到其他单元中,从而允许所有调用方直接访问,即使这些调用方不是自由线程的。

CoCreateFreeThreadedMarshaler 函数执行以下任务:

  1. 创建自由线程封送处理程序对象。
  2. 将此封送处理程序聚合到 punkOuter 参数指定的对象。 此对象通常是要封送其接口指针的对象。
聚合对象的 IMarshal 实现应将IID_IMarshal的 QueryInterface 调用委托给自由线程封送处理程序的 IUnknown。 收到调用后,自由线程封送处理程序将执行以下任务:
  1. 检查 由 CoMarshalInterface 函数的 dwDestContext 参数指定的目标上下文。
  2. 如果目标上下文MSHCTX_INPROC, 将接口指针复制到封送处理流中。
  3. 如果目标上下文是任何其他值,则 查找或创建 COM 的默认 (标准) 封送处理程序的实例,并将封送处理委托给它。
dwDestContext 的值来自 MSHCTX 枚举。 MSHCTX_INPROC指示接口指针将在同一进程中的不同线程之间封送。 由于两个线程都有权访问相同的地址空间,因此客户端线程可以直接取消引用指针,而不必直接调用代理。 在所有其他情况下,都需要代理,因此 CoCreateFreeThreadedMarshaler 将封送处理作业委托给 COM 的默认实现。

在使用 CoCreateFreeThreadedMarshaler 函数时,应小心谨慎。 这是因为聚合自由线程封送收器的对象的性能是通过计算的违反 COM 规则获得的,除非对象在某些限制内运行,否则存在未定义行为的风险。 最重要的限制包括:

  • 自由线程封送处理器对象不能持有指向未聚合自由线程封送处理程序作为其状态一部分的对象上的接口的直接指针。 如果对象使用对普通单线程聚合对象的直接引用,则可能会中断其单线程属性。 如果对象使用对普通多线程聚合对象的直接引用,则这些对象的行为方式可能不区分直接单线程聚合客户端的需求。 例如,这些对象可以旋转新线程并将参数传递给引用普通单线程聚合对象的线程。
  • 自由线程封送处理程序对象不能保存对其他单元中对象的代理的引用。 代理对线程模型很敏感,如果客户端调用错误,可以返回RPC_E_WRONG_THREAD。

要求

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

另请参阅

CoGetInterfaceAndReleaseStream

CoMarshalInterThreadInterfaceInStream