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的标准返回值,以及以下值。
返回代码 | 说明 |
---|---|
|
不支持指定的接口。 |
注解
此方法在调用 CoGetMarshalSizeMax 时间接调用,由服务器进程中负责封送指向对象上接口的指针的任何代码调用。 此封送处理代码通常是 COM 为多个接口之一生成的存根,这些接口可以封送指向在完全不同的对象上实现的接口的指针。 示例包括 IClassFactory 和 IOleItemContainer 接口。 出于讨论目的,负责封送指针的代码称为 封送存根。
若要为对象创建代理,COM 需要原始对象中的两条信息:要写入封送处理流的数据量和代理的 CLSID。
封送存根通过连续调用 CoGetMarshalSizeMax 和 CoMarshalInterface 获取这两条信息。
调用方备注
封送处理存根通过调用 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 |