次の方法で共有


RpcSsContextLockShared 関数 (rpcasync.h)

RpcSsContextLockShared 関数を使用すると、アプリケーションで共有モードでコンテキスト ハンドルの使用を開始できます。

構文

RPC_STATUS RpcSsContextLockShared(
  [in] RPC_BINDING_HANDLE ServerBindingHandle,
  [in] PVOID              UserContext
);

パラメーター

[in] ServerBindingHandle

クライアントへのバインドを表すサーバー上のバインド ハンドル。 サーバーは、このハンドルによって示されるクライアントを偽装します。 0 の値を指定すると、サーバーは、このサーバー スレッドによって提供されているクライアントを偽装します。

[in] UserContext

RPC によってマネージャーまたはサーバー ルーチンに渡されるポインター。 詳細については、「解説」を参照してください。

[out] コンテキスト ハンドルの場合、 RpcSsContextLockShared 関数は操作を実行しません。

戻り値

正常に実行されるとRPC_S_OKを返します。スレッドが共有モードでコンテキスト ハンドルにアクセスできるようになりました。

メモ 有効なエラー コードの一覧については、「 RPC 戻り値」を参照してください。
 

注釈

コンテキスト ハンドルをシリアル化するか非シリアル化するかを変更すると、実行時に検出された条件に基づいてコンテキスト ハンドルを閉じるかどうかを判断するアプリケーションに役立ちます。 コンテキスト ハンドルを非シリアル化 (共有) からシリアル化 (排他) に変更するには、 RpcSsContextLockExclusive 関数を使用します。

UserContext パラメーターの場合、マネージャー ルーチンがコンテキスト ハンドルへのポインターを受け取る場合は、RPC から受信したのと同じポインターを RpcSsContextLockShared 関数に渡す必要があります。 マネージャー ルーチンがコンテキスト ハンドル自体を受け取る場合 (コンテキスト ハンドルのみ )、コンテキスト ハンドル自体を RpcSsContextLockShared 関数に渡す必要があります。 次のコード例は、これを示しています。

UseExclusive (..., /* [in] */ TestContextHandleExclusive *Ctx, ...)
{
    ...
    // we decided that we're done changing the context handle exclusively
    // and that we have extensive processing ahead - downgrade the exclusive
    // lock to shared, and do the processing allowing other readers in
    RpcSsContextLockShared (NULL,    // use the explicit context
        Ctx
        );
    ...
}

マネージャー ルーチンが複数の [in, out] コンテキスト ハンドルを引数として受け取る場合、RPC はマネージャー ルーチンにコンテキスト ハンドル自体ではなくコンテキスト ハンドルへのポインターを提供します。 ポインターは一意であることが保証されるため、 RpcSsContextLockShared 関数に渡すことは明確です。 ただし、関数が複数のコンテキスト ハンドルのみを受け取る場合、RPC はマネージャー ルーチンにコンテキスト ハンドル自体を提供します。 したがって、コンテキスト ハンドルが一意でない場合があります。 この場合、RPC は、指定された値を持つ最初のコンテキスト ハンドルでこの関数を実行します。

共有モードの場合、メソッドはコンテキスト ハンドルを変更しないでください。 RpcSsContextLockShared 関数を呼び出しても、指定されたコンテキスト ハンドルに対するライター ロックは排除されません。これにより、コンテキスト ハンドルが別のスレッドによって変更されなくなります。

非同期呼び出しでは、一度に複数のスレッドから同じ呼び出しオブジェクトで RpcSsContextLockShared 関数を使用することはできません。

RpcSsContextLockShared 関数はメモリ不足の状態のために失敗する可能性があるため、RPC サーバーはこのようなエラーを処理するように準備する必要があります。

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー rpcasync.h (Rpc.h を含む)
Library Rpcrt4.lib
[DLL] Rpcrt4.dll

こちらもご覧ください

RpcSsContextLockExclusive

context_handle

context_handle_noserialize

context_handle_serialize