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);

另请参阅

应用程序配置文件 (ACF)

in

length_is

/osf

out

size_is