IMarshal::GetMarshalSizeMax 方法 (objidl.h)

检索封送处理期间所需的缓冲区的最大大小。

语法

HRESULT GetMarshalSizeMax(
  [in]  REFIID riid,
  [in]  void   *pv,
  [in]  DWORD  dwDestContext,
  [in]  void   *pvDestContext,
  [in]  DWORD  mshlflags,
  [out] DWORD  *pSize
);

参数

[in] riid

对要封送的接口标识符的引用。

[in] pv

要封送的接口指针。 此参数可以为 NULL。

[in] dwDestContext

要取消指定接口的目标上下文。 可能的值来自枚举 MSHCTX。 拆收处理可以发生在当前进程 (MSHCTX_INPROC) 的另一个单元中,也可以发生在与当前进程(MSHCTX_LOCAL) 相同计算机上的另一个进程中。

[in] pvDestContext

此参数是保留的,必须为 NULL

[in] mshlflags

指示是要将封送的数据传输回客户端进程 (典型情况) 还是写入全局表,在该表中可由多个客户端检索。 可能的值来自 MSHLFLAGS 枚举。

[out] pSize

指向接收缓冲区最大大小的变量的指针。

返回值

此方法可以返回E_FAIL和S_OK的标准返回值,以及以下值。

返回代码 说明
E_NOINTERFACE
不支持指定的接口。

注解

此方法在调用 CoGetMarshalSizeMax 时间接调用,由服务器进程中负责封送指向对象上接口的指针的任何代码调用。 此封送处理代码通常是 COM 为多个接口之一生成的存根,这些接口可以封送指向在完全不同的对象上实现的接口的指针。 示例包括 IClassFactoryIOleItemContainer 接口。 出于讨论目的,负责封送指针的代码称为 封送存根

若要为对象创建代理,COM 需要原始对象中的两条信息:要写入封送处理流的数据量和代理的 CLSID。

封送存根通过连续调用 CoGetMarshalSizeMaxCoMarshalInterface 获取这两条信息。

调用方备注

封送处理存根通过调用 CoGetMarshalSizeMax 调用对象的此方法实现,以预分配将传递给 MarshalInterface 的流缓冲区。

如果要实现现有 COM 接口或使用 Microsoft 接口定义语言 (MIDL) 来定义你自己的自定义接口,则不会显式调用此方法。 在任一情况下,MIDL 生成的存根会自动进行调用。

如果不使用 MIDL 定义自己的接口 (请参阅) 定义 COM 接口 ,封送处理存根不必调用 GetMarshalSizeMax,但强烈建议这样做。 对象比接口存根更清楚封送数据包的最大大小。 因此,除非提供一个自动增长的流,该流非常高效,以至于扩展它的开销微不足道,否则即使在实现自己的接口时也应调用此方法。

仅当被封送的对象的内部状态不更改时,此方法返回的值才保证有效。 因此,实际封送处理应在此函数返回后立即完成,否则存根存在以下风险:由于状态发生了一些变化,对象可能需要比最初指示更多的内存来封送。

实施者说明

MarshalInterface 的实现将使用预先分配的缓冲区将封送处理数据写入流中。 如果缓冲区太小,封送处理操作将失败。 因此,此方法返回的值必须是对封送接口所需的数据量的保守估计。 违反此要求应被视为灾难性错误。

在随后调用 MarshalInterface 时, IMarshal 实现不能依赖于调用方实际上事先调用 了 GetMarshalSizeMax 。 它必须仍然警惕流返回STG_E_MEDIUMFULL错误,并准备正常处理它们。

为了确保在将来支持新目标上下文时 ,GetMarshalSizeMax 的实现将继续正常工作,请将封送处理委托给实现无法理解的所有 dwDestContext 值的 COM 默认实现。 若要将封送处理委托给 COM 默认实现,请调用 CoGetStandardMarshal 函数。

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 objidl.h

另请参阅

CoGetMarshalSizeMax

IMarshal