byte_count 属性
[byte_count] ACF 属性是一个参数属性,它将大小(以字节为单位)与指针指示的内存区域相关联。
[ function-attribute-list ] function-name(
[byte_count(length-variable-name)] parameter-name);
...);
-
function-attribute-list
-
指定零个或多个 ACF 函数属性。
-
function-name
-
指定 IDL 文件中定义的函数的名称。 函数名称是必需的。
-
length-variable-name
-
指定 [in]-only 参数的名称,该参数指定 由 parameter-name 引用的内存区域的大小(以字节为单位)。
-
parameter-name
-
指定 IDL 文件中定义的 [out]-only 指针参数的名称。
ACF 属性 [byte_count] 表示 DCE IDL 的 Microsoft 扩展。 因此,使用 MIDL 编译器开关 /osf 时,此属性不可用。
备注
NDR64 语法中不再支持 [字节计数] 属性,因为难以估算所有 [out] 参数所需的大小。
指针参数引用的内存是连续的,不会由客户端存根分配或释放。 [byte_count] 属性的此功能使你可以在客户端内存中创建一个永久性缓冲区区域,该缓冲区可以在多次调用远程过程期间重复使用。
关闭客户端存根内存分配的功能使你可以优化应用程序以提高效率。 例如, [byte_count] 属性可由使用 Microsoft RPC 的服务提供商函数使用。 当用户应用程序调用服务提供程序 API 并发送指向缓冲区的指针时,服务提供商可以将缓冲区指针传递到远程函数。 服务提供商可以在多个远程调用期间重复使用缓冲区,而无需强制用户重新分配内存区域。
内存区域可以包含由多个指针组成的复杂数据结构。 由于内存区域是连续的,因此应用程序不必进行多次调用来单独释放每个指针和结构。 相反,它可以通过一次调用内存分配或释放例程来分配或释放内存区域。
缓冲区必须是 [out]-only 参数,而以字节为单位的缓冲区长度必须是 [in]-only 参数。
指定足以包含所有 [out] 参数的缓冲区。 由于隐藏的填充,请使用高估而不是精确计数。 例如,4 字节指针在 32 位平台上的 4 字节对齐边界上取消封送,8 字节指针位于 64 位平台上的 8 字节边界上。 因此,必须在缓冲区的空间中考虑存根将执行的对齐填充。 此外,C 语言编译期间使用的打包级别可能有所不同。 使用字节计数值,该值考虑为 C 语言编译期间使用的打包级别添加的其他打包字节。 涵盖 32 位平台和 64 位平台的安全做法是假定进入大内存块的每个对象从 8 倍的地址开始。
/* IDL file */
HRESULT proc1([in] unsigned long length,
[out] struct my_struct * pMyStruct);
/* ACF file */
proc1([byte_count(length)] pMyStruct);