RpcSs 内存管理包
代表应用程序分配内存时,存根和运行时使用的默认分配器/释放器对 midl_user_allocate/midl_user_free。 但是,可以使用 ACF 属性 [enable_allocate] 选择 RpcSs 包而不是默认值。 RpcSs 包包含以前缀 RpcSs 或 RpcSm 开头的 RPC 函数。 不建议将 RpcSs 包用于 Windows 应用程序。
注意
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 包调用函数来分配和解除分配内存。