Windows XP 以降では、1 つのインターフェイスでシリアル化されたコンテキスト ハンドルと非シリアル化コンテキスト ハンドルの両方に対応できるため、インターフェイス上の 1 つのメソッドが排他的にコンテキスト ハンドルにアクセス (シリアル化) でき、他のメソッドは共有モードでそのコンテキスト ハンドルにアクセスできます (非シリアル化)。 コンテキスト ハンドルの詳細については、次の属性を参照してください。
シリアル化モードと共有モードのアクセス機能は、読み取り/書き込みロック メカニズムに相当します。シリアル化されたコンテキスト ハンドルを使用するメソッドは排他的ユーザー (ライター) です。一方、非初期化コンテキスト ハンドルを使用するメソッドは共有ユーザー (リーダー) です。 コンテキスト ハンドルの状態を破棄または変更するメソッドはシリアル化する必要があります。 コンテキスト ハンドルから単に読み取るメソッドなど、コンテキスト ハンドルの状態を変更しないメソッドは、非初期化化できます。 混合モードでコンテキスト ハンドルを使用すると、特に複数のスレッドが同じコンテキスト ハンドルを同時に呼び出す場合に、サーバーのスケーラビリティを大幅に向上させることができます。
RPC は、共有モードでコンテキスト ハンドルを使用するメソッドに "書き込みロック" を適用しません。つまり、アプリケーションでは、共有モードのコンテキスト ハンドルが変更されないようにする必要があります。 共有モードで使用されるコンテキスト ハンドルを変更すると、コンテキスト ハンドルの内容が微妙に破損する可能性があり、デバッグできません。
コンテキスト ハンドルのシリアル化ロジックを変更すると、サーバーにのみ影響します。 また、コンテキスト ハンドルのシリアル化ロジックを変更してもワイヤ形式には影響しないため、サーバー上のシリアル化ロジックに対する変更は、サーバーと対話する既存のクライアントの機能には影響しません。
非初期化コンテキスト ハンドルのみを使用することはお勧めしません。 非シリアル化ハンドルを使用するサーバーは、コンテキスト ハンドルを閉じるメソッドのシリアル化されたアクセスに切り替える必要があります。
[出力] 専用のコンテキスト ハンドルは、通常、作成方法によって使用され、シリアル化は必要ありません。 そのため、context_handle_serialize や context_handle_noserializeなど、[出力] のみのコンテキスト ハンドルに適用されるシリアル化属性は、RPC によって無視されます。
手記
作成方法は暗黙的にシリアル化されます。
例
次の 2 つの例は、コンテキスト ハンドルの混合モードのシリアル化を有効にする方法を示しています。
最初の例は、IDL ファイルでこれを行う方法を示しています。
typedef [context_handle] void *TestContextHandleExclusive;
typedef [context_handle] TestContextHandleExclusive TestContextHandleShared;
void
UseShared(...
[in] TestContextHandleShared *Ctx,
...);
void
UseExclusive(...
[in, out] TestContextHandleExclusive *Ctx,
...);
2 番目の例は、ACF ファイルでコンテキスト ハンドルの混合モードのシリアル化を有効にする方法を示しています。
typedef [context_handle_serialize] TestContextHandleExclusive;
typedef [context_handle_noserialize] TestContextHandleShared;
関連トピック