【发布时间】:2015-04-28 04:30:15
【问题描述】:
我无法在 Citrix 服务器和本地 PC 之间创建动态虚拟通道。服务器端出现的错误是:
CSession::CreateDynamicChannel:找不到传输支持 DVC=
我有一个 C++ COM dll 在本地 PC 上注册为插件,它似乎已被 Citrix Receiver 的虚拟通道管理器正确加载(我从初始化到将侦听器附加到端点的跟踪记录表明一切正常)。
但是,当我们在 Citrix 服务器上启动可执行文件时,我们会收到上述错误。可执行文件是 C#/.Net 应用程序。该错误是响应我对 WTSVirtualChannelOpenEx 的调用而发生的。
我在 C# 中对该函数的函数原型如下:
[DllImport("wtsapi32.dll", SetLastError = true)]
private static extern IntPtr WTSVirtualChannelOpenEx(
[In]
[param: MarshalAs(UnmanagedType.I4)]
int SessionId,
[In]
[param: MarshalAs(UnmanagedType.LPStr)]
string VirtualName,
[In]
[param: MarshalAs(UnmanagedType.U4)]
int flags);
我对函数的实际调用如下:
_vcHandle = WTSVirtualChannelOpenEx(
(int)Session.WTS_CURRENT_SESSION,
pluginName,
(int)(DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC | DynamicChannel.WTS_CHANNEL_OPTION_DYNAMIC_PRI_HIGH)
);
“pluginName”的值是从配置文件加载的 7 个字符的字符串。
关于动态虚拟通道的 Citrix 文档只是说在客户端和服务器端都遵循 Microsoft API,我已经这样做了。该文档指定了如何在客户端注册插件,但没有规定必须在服务器上执行任何额外操作。
据我了解,服务器上的虚拟通道管理器从客户端的虚拟通道管理器中获取插件名称列表。然后,服务器端虚拟通道管理器将名称存储在一个表中。此后,当任何程序通过动态虚拟通道向客户端插件请求连接时,服务器端虚拟通道管理器会在表中查找名称,然后将连接请求发送给客户端。
设置中是否有需要做的事情。例如,管理员是否需要将动态虚拟通道分配给特定的静态虚拟通道编号,或者虚拟通道管理器是否在发出请求时动态处理(因此名称为“动态”) ?
我无法在文档或网络搜索中找到任何关于我们遇到的错误的参考资料。
【问题讨论】:
标签: c# dynamic virtual channel citrix