C# WinForms ActiveX RDP客户端问题与NLA

C# WinForms ActiveX RDP客户端问题与NLA,c#,activex,rdp,C#,Activex,Rdp,我正在尝试用C语言制作一个WinForms RDP客户端,使用RDP ActiveX控件作为一个学习练习。当目标服务器不使用网络级身份验证(NLA)时,我可以让一切正常工作,但当我尝试将控件配置为使用“EnableCredSSupSupport”时,我认为NLA需要使用“EnableCredSSupSupport”,在运行代码时会出现以下错误: 类型的未处理异常 中出现“System.Windows.Forms.AxHost.InvalidActiviexStateException” AxIn

我正在尝试用C语言制作一个WinForms RDP客户端,使用RDP ActiveX控件作为一个学习练习。当目标服务器不使用网络级身份验证(NLA)时,我可以让一切正常工作,但当我尝试将控件配置为使用“EnableCredSSupSupport”时,我认为NLA需要使用“EnableCredSSupSupport”,在运行代码时会出现以下错误:

类型的未处理异常 中出现“System.Windows.Forms.AxHost.InvalidActiviexStateException” AxInterop.MSTSCLib.dll

代码是:

        AxMsRdpClient9NotSafeForScripting rdp;

        rdp = new AxMsRdpClient9NotSafeForScripting();

        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));

        ((System.ComponentModel.ISupportInitialize)(rdp)).BeginInit();
        rdp.Dock = System.Windows.Forms.DockStyle.Fill;
        rdp.Enabled = true;
        rdp.Location = new System.Drawing.Point(0, 0);
        rdp.Name = "rdp";
        rdp.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("rdp.OcxState")));
        rdp.Size = new System.Drawing.Size(828, 687);
        rdp.TabIndex = 0;

        rdp.AdvancedSettings9.AuthenticationLevel = 2;
        rdp.AdvancedSettings9.EnableCredSspSupport = true;

        MainsplitContainer.Panel2.Controls.Add(rdp);

        ((System.ComponentModel.ISupportInitialize)(rdp)).EndInit();

        rdp.Server = "XXX.XXX.XXX.XXX";
        rdp.Connect();
很多代码都是从以下来源拼凑而成的,但是学习代码通常是站在巨人的肩膀上的,对吗

…还有一些我没有名声的消息来源(第一篇帖子!)

有什么见解可以帮助我吗

谢谢

..A和工作代码:

            AxMSTSCLib.AxMsRdpClient8NotSafeForScripting _RDPClient;
        _RDPClient = new AxMSTSCLib.AxMsRdpClient8NotSafeForScripting();

        MainsplitContainer.Panel2.Controls.Add(_RDPClient);

        ((System.ComponentModel.ISupportInitialize)(_RDPClient)).BeginInit();
        _RDPClient.Dock = System.Windows.Forms.DockStyle.Fill;
        _RDPClient.Enabled = true;
        _RDPClient.Location = new System.Drawing.Point(0, 0);
        _RDPClient.Name = "axMsTscAxNotSafeForScripting1";
        _RDPClient.OcxState = ((System.Windows.Forms.AxHost.State)(_RDPClient.OcxState));
        _RDPClient.Size = new System.Drawing.Size(579, 608);
        _RDPClient.TabIndex = 0;
        _RDPClient.AdvancedSettings8.EnableCredSspSupport = true;
        ((System.ComponentModel.ISupportInitialize)(_RDPClient)).EndInit();

        _RDPClient.OnDisconnected += new IMsTscAxEvents_OnDisconnectedEventHandler(axMsTscAx_OnDisconnected);


        _RDPClient.Server = IP;
        _RDPClient.Connect();
使用:


在C#

中查找等效项早期设置AxHost属性很好,但在创建RDP组件之前,您无法接触其属性。这是典型的惰性.NET方式,在最后一刻发生的。将分配移动到表单的加载事件处理程序。感谢您的回复!我是C#的新手,所以不太清楚AxHost属性和RDP组件属性之间的区别。为了进行测试,我将上面的所有内容移动到Form1_Load事件处理程序。我不再收到错误,但我也没有将RDP组件加载到面板中。这里的最终目标是制作一个简单的带选项卡的RDP客户端,每个会话都有选项卡。我希望同时打开多个会话。如果我将内容移动到_Load事件处理程序,看起来我无法实现这一点?再次感谢!最明显的方法是以后再添加标签。我想对有专业知识的人来说是显而易见的!无论如何,我现在已经让它工作,并将粘贴上面的代码。我(想我)所做的就是移动控件。添加到顶部并开始使用控件的V8。我想这是一个符合你的建议的预兆,但我在黑暗艺术方面没有足够的技能来评论!
CType(rdp, System.ComponentModel.ISupportInitialize).EndInit()
rdp.CreateControl()