軽量クライアント側ハンドラー

軽量のクライアント側ハンドラーを使用すると、任意のサイズの一般的なクライアント側ハンドラーを作成して、あらゆる種類の標準タスクを実行できます。 ハンドラーとして、これらは複数のクライアントで使用できます。 OLE ハンドラーとは異なり、サーバーを起動する前に作成できず、有効期間がプロキシ マネージャーの有効期間に関連付けられているため、ハンドラーが途中で解放される可能性のある競合状態が回避されます。

プロキシ マネージャーは、 IMarshal インターフェイスを実装するシステムによって作成されたオブジェクトです。 標準マーシャリングを使用する場合、 CoGetStandardMarshal (または軽量ハンドラーの集計マーシャラーを作成するために CoGetStdMarshalEx) を呼び出すときにシステムによって自動的に作成され、オブジェクトに IClientSecurity インターフェイスと IMultiQI インターフェイスも実装されます。 サーバー側には、 IMarshal も実装する対応するシステム オブジェクトがあります。 これらのオブジェクトは、透過的にマーシャリングを処理します。

これらのハンドラーには、次の 2 つの一般的な種類を実装する必要があります。

  • サーバーからの追加データを必要としないサービスを実行するハンドラー
  • サーバーからの追加データを使用するハンドラー

サーバーによって提供されるストリーム内の追加データの潜在的な用途は次のとおりです。

  • サーバーからの静的データ。 マーシャリングされる特定のインターフェイスに関係なく、サーバーはストリームに同じデータを書き込みます。
  • サーバーからのインターフェイスごとのデータ。 マーシャリングされる特定のインターフェイスによっては、サーバーがストリームに異なるデータを書き込む場合があります。
  • インターフェイスごとのヘルパー。 インターフェイスごとの COM コンポーネントがクライアント ハンドラーに集約され、標準プロキシに委任されます。 たとえば、ネットワーク パフォーマンスを向上させるために、 IStream の COM コンポーネントでは、データのクライアント側キャッシュ、先読み、書き込みビハインド、操作ロックなどを実行できます。
  • インターフェイスのネットワーク バージョン。 インターフェイスのネットワーク バージョンは、クライアントおよびサーバー アプリケーション コードによって公開されるインターフェイスとは異なります。 たとえば、埋め込みサーバー ハンドラーと同様に、同じネットワーク インターフェイス INetAB 経由で多重化されたインターフェイス IA と IB を多重化できます。 たとえば、データ転送インターフェイスを、パイプを使用して効率的なデータ転送を行うネットワーク インターフェイスに変換できます。

下位レベルのクライアントは、カスタム ハンドラーを持つインターフェイスをアンマーシャリングする機能を持たない可能性があります。2 つの理由があります。まず、サーバー ハンドラーが集計され、オブジェクトがハンドラーを必要とする場合に、カスタム マーシャリングされたパケットで使用される CLSID を理解できない可能性があります。 次に、集計された標準マーシャラーを作成し、リモート QueryInterface 呼び出しを実行するために COM の新機能が必要な場合、ハンドラー コードがクライアント側で実行されない場合もあります。

OLE ハンドラ