我无法在Citrix服务器和本地PC之间创建动态虚拟通道。服务器端出现的错误是:
CSession :: CreateDynamicChannel:找不到支持DVC =
的传输我在本地PC上注册了一个C ++ COM dll插件,看起来它正由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,我已经完成了。该文档规定了如何在客户端注册插件,但没有规定必须在服务器上做任何额外的事情。
据我了解,服务器上的虚拟通道管理器从客户端的虚拟通道管理器获取插件名称列表。然后,服务器端虚拟通道管理器将名称存储在表中。此后,当任何程序通过动态虚拟通道请求连接到客户端插件时,服务器端虚拟通道管理器在表中查找名称,然后将连接请求发送到客户端。
是否可能需要在设置中执行某些操作。例如,管理员是否需要将动态虚拟通道分配给特定的静态虚拟通道号,或者虚拟通道管理器是否需要动态处理(因此名称" dynamic")提出了请求?
我无法在文档或搜索网络中找到任何引用我们正在经历的错误。
答案 0 :(得分:1)
没有为动态VC分配VC。它们通过在一个静态(底层)VC上进行多路复用来工作。
你用什么名字来代表" pluginName"?如果您查看SDK附带的vdping示例,您将在DriverOpen实现的客户端代码中看到一行,如下所示:
OpenVirtualChannel.pVCName = CTXPING_VIRTUAL_CHANNEL_NAME;
此常量在关联的vdping.h头文件中定义:
#define CTXPING_VIRTUAL_CHANNEL_NAME "CTXPING"
因此,如果我想在服务器上打开此VD,我需要使用&#34; CTXPING&#34;作为插件名称,您可以在SDK中的ctxping.c中的相关服务器示例代码中看到(请注意示例很旧,因此他们使用Citrix WF API,使用WTSVirtualChannelOpenEx也很好):< / p>
hVC = WFVirtualChannelOpen( WF_CURRENT_SERVER,
WF_CURRENT_SESSION,
CTXPING_VIRTUAL_CHANNEL_NAME );
除此之外,您只需确保已正确遵循注册步骤并添加必要的注册表项。请注意,文档是在x64之前创建的。因此,虽然文档声明:
HKLM\Software\Citrix\ICA Client\etc...
您需要确保使用32位注册表配置单元,因为Windows客户端是32位:
HKLM\Software\Wow6432Node\Citrix\ICA Client\etc...