虚拟通道客户端 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 函数关闭通道。 但是,不需要调用它,因为远程桌面服务会在客户端与服务器断开连接时自动关闭所有通道。