远程桌面ActiveX控件

时间:2014-02-26 17:43:59

标签: c# activex remote-desktop

我有一个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初始化并正常工作。

1 个答案:

答案 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支持以下接口:

  • 最高版本8的IMsRdpClient *
  • 直到版本5的IMsRdpClientNonScriptable
  • IMsTscNonScriptable
  • IMsRdpPreferredRedirectionInfo
  • IMsRdpExtendedSettings

MsRdpClient3NotSafeForScripting支持

  • IMsRdpClient *的第2版
  • IMsRdpClientNonScriptable
  • IMsTscNonScriptable。

如果要检测您的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);
    }
}