次の方法で共有


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を返します。 「解説」を参照してください。

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

注釈

コンテキスト ハンドルをシリアル化するか非シリアル化するかを変更すると、実行時に検出された条件に基づいてコンテキスト ハンドルを閉じるかどうかを決定するアプリケーションに役立ちます。 コンテキスト ハンドルをシリアル化 (排他) から非シリアル化 (共有) に変更するには、 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

こちらもご覧ください

RpcSsContextLockShared

context_handle

context_handle_noserialize

context_handle_serialize