虚拟通道客户端 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 函数一次,而不是将数据重新生成为原始大小的块。 每次调用 VirtualChannelOpenEvent 都会指示区块的大小、服务器写入的总大小,以及数据是构成服务器写入的块的开头、中间还是末尾。

可以调用 VirtualChannelClose 函数来关闭通道。 但是,不需要调用它,因为远程桌面服务会在客户端与服务器断开连接时自动关闭所有通道。