创建RDP连接时出错

时间:2012-05-03 00:59:01

标签: c# com casting

我正在尝试使用Windows格式anf AxMsTscAxNotSafeForScripting

创建一些RDP客户端

我有以下方法:

_rdpList = new List<AxMsTscAxNotSafeForScripting>();


public bool addRDP(string ip, string username, string pass)
    {
        for (int i = 0; i < number ; i++)
        {

            if (_rdpList[i].Connected.ToString() != "1")
            {
                try
                {
                    _rdpList[i].Server = ip;
                    _rdpList[i].UserName = username;



                    IMsTscNonScriptable secured = (IMsTscNonScriptable) _rdpList[i].GetOcx());
                    secured.ClearTextPassword = pass;
                    _rdpList[i].Connect();
                    _picList[int.Parse(_rdpList[i].Name)].ImageLocation = greenPath;
                    return true;

                }
                catch (Exception Ex)
                {
                    MessageBox.Show("Error Connecting", "Error connecting to remote desktop " + ip + " Error:  " + Ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

我从线程调用此方法,并尝试执行此操作:IMsTscNonScriptable secured = (IMsTscNonScriptable) _rdpList[i].GetOcx());

失败并出现以下错误:

  

无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“MSTSCLib.IMsTscNonScriptable”。此操作失败,因为对IID为“{C1E6743A-41C1-4A74-832A-0DD06C1C7A0E}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))

我整天都在努力,但我无法理解这个问题?

奇怪的是,如果我从Windows窗体事件(例如按钮单击)调用此方法,那么当我从我的WCF服务调用此方法时,唯一的问题就出现了。

请帮忙。

2 个答案:

答案 0 :(得分:1)

可能有很多解决方案,但我认为最简单的方法是在这里使用dynamic。据我了解,这是他们创建dynamic关键字的部分原因。只要你知道界面,那么你可以使用它而不必担心投射。你会失去智力感,但要省去自己在COM上拔头发的麻烦

Some documentation on dynamic

您的代码如下所示:

dynamic secured = _rdpList[i].GetOcx());

答案 1 :(得分:1)

替换代码:

df=df.copy()

使用:

IMsTscNonScriptable secured = (IMsTscNonScriptable) _rdpList[i].GetOcx());
secured.ClearTextPassword = pass;

注意:如果AdvancedSettings2在对象_rdpList [i]上不可用,请删除对MSTSCLib的引用并再次添加。