RpcSs 内存管理包

代表应用程序分配内存时,存根和运行时使用的默认分配器/解除分配器对 midl_user_allocate/midl_user_free。 但是,可以使用 ACF 属性 [enable_allocate]选择 RpcSs 包而不是默认包。 RpcSs 包包含以前缀开头的 RPC 函数 RpcSsRpcSm。 不建议对 Windows 应用程序使用 RpcSs 包。

注意

Rpcss 内存管理包已过时。 建议在其位置使用 midl_user_allocatemidl_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 */

应用程序可以通过调用 RpcSsFreeRpcSmFree 函数显式释放内存。 请注意,这些函数实际上不会释放内存。 它们将其标记为要删除。 当程序 调用 rpcSsDisableAllocateRpcSsDisableAllocate时,RPC 库会释放内存。

还可以通过调用 RpcSmEnableAllocate 例程来为应用程序启用内存管理环境(并且可以通过调用 RpcSmDisableAllocate 例程来禁用它)。 启用后,应用程序代码可以通过从 RpcSs 包调用函数来分配和解除分配内存。