RpcSsContextLockExclusive 関数 (rpcasync.h)
RpcSsContextLockExclusive 関数を使用すると、アプリケーションで排他モードでコンテキスト ハンドルの使用を開始できます。 RpcSsContextLockExclusive 関数を使用すると、IDL または ACF ファイルで非シリアル化 (共有) として宣言されたメソッドを動的に変更して、シリアル化 (排他) モードでコンテキスト ハンドルにアクセスできます。
構文
RPC_STATUS RpcSsContextLockExclusive(
[in] RPC_BINDING_HANDLE ServerBindingHandle,
[in] PVOID UserContext
);
パラメーター
[in] ServerBindingHandle
クライアントへのバインドを表すサーバー上のバインド ハンドル。 サーバーは、このハンドルによって示されるクライアントを偽装します。 値 0 を指定すると、サーバーは、このサーバー スレッドによって処理されるクライアントを偽装します。
[in] UserContext
RPC によってマネージャーまたはサーバー ルーチンに渡されるポインター。 「解説」を参照してください。
アウトのみのコンテキスト ハンドルの場合、 RpcSsContextLockExclusive 関数は操作を実行しません。
戻り値
正常に実行されたRPC_S_OKを返します。スレッドが排他モードでコンテキスト ハンドルにアクセスできるようになりました。 コンテキスト ハンドルに対して複数のスレッドが排他ロックを試みた場合にERROR_MORE_WRITESを返します。 「解説」を参照してください。
注釈
コンテキスト ハンドルをシリアル化するか非シリアル化するかを変更すると、実行時に検出された条件に基づいてコンテキスト ハンドルを閉じるかどうかを決定するアプリケーションに役立ちます。 コンテキスト ハンドルをシリアル化 (排他) から非シリアル化 (共有) に変更するには、 RpcSsContextLockShared 関数を使用します。
UserContext パラメーターの場合、マネージャー ルーチンがコンテキスト ハンドルへのポインターを受け取る場合は、RPC から受け取ったのと同じポインターを RpcSsContextLockExclusive 関数に渡す必要があります。 マネージャー ルーチンがコンテキスト ハンドル自体を受け取る場合 (コンテキスト ハンドルのみでは一般的です)、コンテキスト ハンドル自体を RpcSsContextLockExclusive 関数に渡す必要があります。 次のコード例は、これを示しています。
void _UseShared(
/* [in] */ handle_t Binding,
//...
/* [in] */ TestContextHandleShared *Ctx,
//...
)
{
//...
RpcStatus = RpcSsContextLockExclusive(Binding, Ctx);
//...
}
マネージャー ルーチンが複数の [in, out] コンテキスト ハンドルを引数として受け取る場合、RPC はマネージャー ルーチンにコンテキスト ハンドル自体ではなくコンテキスト ハンドルへのポインターを提供します。 ポインターは一意であることが保証されているため、 RpcSsContextLockExclusive 関数に渡すことは明確ではありません。 ただし、関数が複数のコンテキスト ハンドルのみを受け取る場合、RPC はマネージャー ルーチンにコンテキスト ハンドル自体を提供します。 したがって、コンテキスト ハンドルが一意でない可能性があります。 この場合、RPC は、指定された値を使用して最初のコンテキスト ハンドルでこの関数を実行します。
共有モードの場合、メソッドはコンテキスト ハンドルを変更しないでください。 RpcSsContextLockExclusive 関数を呼び出しても、指定されたコンテキスト ハンドルに対するリーダー ロックは排除されません。これにより、共有モードでコンテキスト ハンドルを変更しないアプリケーションに対して、変更されていないコンテキスト ハンドルが保証されます。 2 つのスレッドが 同時に RpcSsContextLockExclusive 関数を呼び出して同じコンテキスト ハンドルに対して排他ロックを取得しようとすると、1 つの任意に選択されたスレッドがRPC_S_OK返され、もう 1 つのスレッドがERROR_MORE_WRITES返されます。 ERROR_MORE_WRITES返されるスレッドは排他ロックを受け取りますが、コンテキスト ハンドルに対するリーダー ロックは、戻り時に失われます。 ERROR_MORE_WRITESを受け取る呼び出し元は、破棄された可能性があるため、 RpcSsContextLockExclusive 関数の戻り時にコンテキスト ハンドルについて何も想定しない必要があります。
非同期呼び出しでは、一度に複数のスレッドから同じ呼び出しオブジェクトに 対して RpcSsContextLockExclusive 関数を使用することはできません。
RpcSsContextLockExclusive 関数はメモリ不足の状態のために失敗する可能性があるため、このようなエラーを処理するために RPC サーバーを準備する必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | rpcasync.h (Rpc.h を含む) |
Library | Rpcrt4.lib |
[DLL] | Rpcrt4.dll |