RpcSs メモリ管理パッケージ
アプリケーションの代わりにメモリを割り当てるときにスタブと実行時に使用される既定のアロケーター/割り当て解除ペアは、midl_user_free midl_user_allocate/。 ただし、ACF 属性 [enable_allocate] を使用して、既定ではなく RpcSs パッケージを選択できます。 RpcSs パッケージは、プレフィックス RpcSs または RpcSm で始まる RPC 関数で構成されます。 RpcSs パッケージは、Windows アプリケーションには推奨されません。
Note
Rpcss メモリ管理パッケージは廃止されました。 midl_user_allocateとmidl_user_freeを使用することをお勧めします。
/osf モードでは、完全なポインターが使用されたとき、引数にメモリ割り当てが必要な場合、または [enable_allocate] 属性を使用した結果として、RPCSs パッケージが MIDL で生成されたスタブに対して自動的に有効になります。 既定の (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 関数を呼び出すことで、メモリを明示的 に 解放できます。 これらの関数は実際にはメモリを解放しないことに注意してください。 削除対象としてマークされます。 RPC ライブラリは、プログラムが RpcSsDisableAllocate または RpcSsDisableAllocate を呼び出すとき にメモリを解放します。
RpcSmEnableAllocate ルーチンを呼び出すことで、アプリケーションのメモリ管理環境を有効にすることもできます (また、RpcSmDisableAllocate ルーチンを呼び出すことで無効にすることもできます)。 有効にすると、アプリケーション コードは RpcSs パッケージから関数を呼び出すことによってメモリの割り当てと割り当てを解除できます。