在多个线程上运行COM组件控件

本文关键字:COM 组件 控件 运行 线程 | 更新日期: 2023-09-27 18:06:45

我有一个公司的帮助台软件包,我正试图将其与远程桌面集成。我希望实现的功能之一是确定(当您浏览我们的客户端列表时)远程桌面连接当前是否可用于所选系统的能力。我使用的库是"微软终端服务控制"- AxInterop。MSTSCLib AxMsRdpClient7)

现在我的问题是,我想在一个单独的线程上执行这个任务(尝试连接),以防止阻塞UI(考虑到我可能同时在多个客户端上尝试连接),到目前为止还没有成功。

这是一个代码的概念…

public void AttemptLogin(string password)
{
    this._thread = new Thread(LoginAttempt);
    this._thread.SetApartmentState(ApartmentState.STA);
    this._thread.Start(password);
}

protected void LoginAttempt(object password)
{
    AxMsRdpClient7 remoteDesktop = new AxMsRdpClient7();
    remoteDesktop.CreateControl();
    remoteDesktop.UserName = this._username;
    remoteDesktop.Server = this._server;
    WireEventHandlers(remoteDesktop);
    IMsTscNonScriptable passwordContainer = (IMsTscNonScriptable)remoteDesktop.GetOcx();
    passwordContainer.ClearTextPassword = password.ToString();
    remoteDesktop.Connect();
}

基本上上面的代码工作完美,如果我在UI线程中执行它,并将控件添加到表单集合,但当我试图在一个单独的线程上运行这个,它似乎根本没有发生任何动作。connect()不会引发异常。没有引发任何事件,似乎什么也没发生。

我想我希望的是确认我正在尝试做的事情(在线程中运行COM组件)实际上是可能的,并且关于需要哪些步骤才能使其工作的任何进一步指导将非常感谢。

在多个线程上运行COM组件控件

好消息是,你正在努力做的事情是可能的。由于您正在创建COM对象并在同一线程中使用它,因此无需担心编组问题。(如果你开始将COM接口指针传递给另一个线程,创建该对象的STA线程将不得不使用消息泵。)

我没有使用MSTSC控件,但我的猜测是,它可能需要托管在一个窗口之前,它将工作,即使它是一个隐藏的窗口。我会创建一个新的形式(在你的后台STA线程),看看是否有帮助。然后,您可以尝试隐藏表单,直到需要显示终端服务客户端。如果您不确定如何在多个线程上拥有多个窗体,请参见多个窗口,多个线程