我有一个C#应用程序,我多年来一直用它来编写远程桌面连接的脚本。它始终建立在AxMsRdpClient3上(注意3,我猜这是某种版本号)。我希望能够使用AxMsRdpClient8(版本8)中的功能,但据我了解,这需要安装远程桌面版本8。但并非所有用户都安装了这些用户(甚至可以在Windows XP / Vista上安装)。
正如盛江建议的那样,我现在正在运行时创建控件,我的代码如下:
try
{
AxMsRdpClient8 rdp8 = new AxMsRdpClient8();
rdp8.BeginInit();
// set some properties here
rdp8.EndInit(); // throws Exception on machines without version 8 installed
}
catch (Exception ex)
{
AxMsRdpClient3 rdp3 = new AxMsRdpClient3();
rdp3.BeginInit();
// set some properties here
rdp3.EndInit();
}
正如预期的那样,rdp8.EndInit()会在未安装远程桌面版本8的计算机上引发异常。问题是,在我们尝试创建AxMSRDPClient8之后,rdp3.EndInit()也在旧机器上失败(类未注册)。如果我不首先尝试创建AxMSRDPClient8,则AxMSRDPClient3初始化并正常工作。
答案 0 :(得分:2)
each version of RDP activeX has a different clsid。您需要检测操作系统版本并创建an activex at runtime with the class id corresponding to the lowest OS version you plan to support。
如果您的代码依赖于后期绑定,则可以更好地重写代码以使用IMsRdpClient *和IMsRdpClientNonScriptable *。例如,MsRdpClient8NotSafeForScripting支持以下接口:
MsRdpClient3NotSafeForScripting支持
如果要检测您的activex是否支持特定的接口版本,只需转换ActiveX的实例 到界面。当演员表失败时,你知道界面不受支持。
protected void CreateRdpActiveX()
{
try
{
string clsid=GetRdpActiveXClsIdByOSVersion();
Type type = Type.GetTypeFromCLSID(clsid, true);
this.axRdp = new AxHost (type.GUID.ToString());
((ISupportInitialize)(axRdp)).BeginInit();
SuspendLayout();
this.panel1.Controls.Add(axRdp);
((ISupportInitialize)(axRdp)).EndInit();
ResumeLayout(false);
var msRdpClient8 = axRdp.GetOcx() as IMsRdpClient8;
if(msRdpClient8!=null)
{
var advancedSettings9 =msRdpClient8.AdvancedSettings9 as IMsRdpClientAdvancedSettings8;
if(advancedSettings9!=null)
advancedSettings9.BandwidthDetection=true;
}
}
catch (System.Exception ex)
{
System.Console.WriteLine(ex.Message);
}
}