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