RpcSs 内存管理包

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

注意

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 函数显式释放内存。 请注意,这些函数实际上不会释放内存。 将其标记为要删除。 当程序调用 RpcSsDisableAllocate 或 RpcSsDisableAllocate,RPC 库会释放内存。

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