Share via


仮想チャネル クライアント DLL

仮想チャネル アプリケーションのクライアントは、クライアント コンピューター上のリモート デスクトップ サービスの初期化中に読み込まれる DLL です。 DLL はクライアント コンピューターに登録する必要があります。 詳細については、「 仮想チャネル クライアントの登録」を参照してください。

クライアント DLL は、初期化中にリモート デスクトップ サービスが呼び出す VirtualChannelEntry 関数をエクスポートする必要があります。 VirtualChannelEntry エントリ ポイントは、CHANNEL_ENTRY_POINTS構造体へのポインターを受け取ります。 この構造体には、クライアント DLL が仮想チャネルにアクセスするために呼び出す関数へのポインターが含まれています。

機能 説明
VirtualChannelInit
クライアントによって使用される仮想チャネルの名前を登録し、リモート デスクトップ サービスがクライアント接続に影響を与えるイベントについてクライアントに通知する VirtualChannelInitEvent コールバック関数を提供します。
VirtualChannelOpen
指定した仮想チャネルのクライアント側を開き、仮想チャネルに影響を与えるイベントについてリモート デスクトップ サービスがクライアントに通知する VirtualChannelOpenEvent コールバック関数を提供します。
VirtualChannelWrite
仮想チャネルにデータを書き込みます。 リモート デスクトップ サービスは、このデータを仮想チャネルのサーバー側に送信します。 サーバー側は WTSVirtualChannelRead 関数を呼び出してデータを読み取ります。
VirtualChannelClose
仮想チャネルを閉じます。

DLL の VirtualChannelEntry 関数は、仮想チャネルへのアクセスを初期化するために VirtualChannelInit 関数を呼び出す必要があります。 VirtualChannelInit を呼び出すときは、VirtualChannelInitEvent コールバック関数へのポインターを渡す必要があります。 リモート デスクトップ サービスは、初期化が完了したときにこのコールバック関数を呼び出し、リモート デスクトップ セッション ホスト (RD セッション ホスト) サーバーとの接続が確立されたときに再度呼び出します。

接続が確立されたら、 VirtualChannelOpen 関数を呼び出して、 VirtualChannelInit 呼び出しによって登録された仮想チャネルを開くことができます。 VirtualChannelOpen 呼び出しは、VirtualChannelOpenEvent コールバック関数へのポインターを指定します。

VirtualChannelOpen 呼び出しが返されたら、VirtualChannelWrite 関数を呼び出して仮想チャネルに書き込むことができます。 書き込み操作は非同期であるため、リモート デスクトップ サービスが VirtualChannelOpenEvent 関数を呼び出して書き込み操作が完了したことを示すまで、VirtualChannelWrite に渡されたバッファーを解放または再利用することはできません。 VirtualChannelWrite を呼び出すときは、書き込み操作を識別するユーザー データの一部を渡すことができます。 リモート デスクトップ サービスは、 VirtualChannelOpenEvent を呼び出して操作が完了したことを通知するときに、このユーザー データを返します。 仮想チャネルのサーバー側で、サーバー アドインは WTSVirtualChannelRead 関数を呼び出してデータを読み取ります。

リモート デスクトップ サービスでは、サーバー モジュールによって仮想チャネルにデータが書き込まれるときに、 VirtualChannelOpenEvent 関数も呼び出されます。 サーバー モジュールは WTSVirtualChannelWrite 関数を呼び出して、仮想チャネルのサーバー側にデータを書き込みます。

クライアント モジュールとサーバー モジュールは、任意のサイズのデータ ブロックを仮想チャネルに書き込むことができます。 ただし、データを送信する前に、リモート デスクトップ サービスはデータを CHANNEL_CHUNK_LENGTH バイトのチャンクにセグメント化します。 リモート デスクトップ サービスは、データを元のサイズのブロックに再構築するのではなく、データのチャンクごとに VirtualChannelOpenEvent 関数を 1 回呼び出します。 VirtualChannelOpenEvent の各呼び出しは、チャンクのサイズ、サーバーによって書き込まれた合計サイズ、およびデータがサーバーによって書き込まれたブロックの先頭、中央、または末尾を構成しているかどうかを示します。

VirtualChannelClose 関数を呼び出して、チャネルを閉じます。 ただし、クライアントがサーバーから切断されると、リモート デスクトップ サービスはすべてのチャネルを自動的に閉じるので、呼び出す必要はありません。