RpcSs 内存管理包
代表应用程序分配内存时,存根和运行时使用的默认分配器/解除分配器对 midl_user_allocate/midl_user_free。 但是,可以使用 ACF 属性 [enable_allocate]选择 RpcSs 包而不是默认包。 RpcSs 包包含以前缀开头的 RPC 函数 RpcSs 或 RpcSm。 不建议对 Windows 应用程序使用 RpcSs 包。
注意
Rpcss 内存管理包已过时。 建议在其位置使用 midl_user_allocate 和 midl_user_free。
在 /osf 模式下,当使用完整指针、参数需要内存分配或使用 [enable_allocate] 属性时,会自动为 MIDL 生成的存根启用 RpcSs 包。 在默认(Microsoft扩展)模式下,仅当使用 [enable_allocate] 属性时,才会启用 RpcSs 包。 [enable_allocate] 属性通过服务器端存根启用 RpcSs 环境。 客户端会收到有关 RpcSs 包可能已启用的可能性的警报。 在 /osf 模式下,客户端不会受到影响。
启用 RpcSs 包后,服务器端的内存分配是通过专用 RpcSs 内存管理分配器和解除分配器对完成的。 可以通过调用 rpcSmAllocate(或RpcSsAllocate)来使用相同的机制分配内存。 从服务器存根返回后,RpcSs 包分配的所有内存将自动释放。 以下示例演示如何启用 RpcSs 包:
/* ACF file fragment */
[
implicit_handle(handle_t GlobalHandle),
enable_allocate
]
interface iface
{
}
/*Server management routine fragment. Replaces p=midl_user_allocate(size); */
p=RpcSsAllocate(size); /*raises exception */
p=RpcSmAllocate(size, &status); /*returns error code */
应用程序可以通过调用 RpcSsFree 或 RpcSmFree 函数显式释放内存。 请注意,这些函数实际上不会释放内存。 它们将其标记为要删除。 当程序 调用 rpcSsDisableAllocate 或 RpcSsDisableAllocate时,RPC 库会释放内存。
还可以通过调用 RpcSmEnableAllocate 例程来为应用程序启用内存管理环境(并且可以通过调用 RpcSmDisableAllocate 例程来禁用它)。 启用后,应用程序代码可以通过从 RpcSs 包调用函数来分配和解除分配内存。