【问题标题】:Winforms/ActiveX cross threaded callsWinforms/ActiveX 跨线程调用
【发布时间】:2010-07-13 03:11:40
【问题描述】:

我有一个应用程序,其中我在一个信息亭类型的应用程序中托管多种类型的内容(图像、PowerPoint 演示文稿、视频等)。用户必须能够在这些内容位之间来回翻页,最好使用信息亭上的触摸屏手势,即点击屏幕的一侧前进,另一侧返回。

不幸的是,显示内容的控件可能有进一步的嵌套,所以我使用 Win32 鼠标挂钩来捕获鼠标点击,检查它们是否在指定区域内。这很好用。不幸的是,这些点击事件是(间接)调用我用来承载 PP 演示文稿(DSOFramer)的 ActiveX 控件上的方法,它导致了这个讨厌的 COM 异常:

An outgoing call cannot be made since the application is dispatching an input-synchronous call. (Exception from HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL))

我最好的猜测是低级鼠标钩子是从不同的线程调用的,因为如果我直接从 Winforms UI 线程进行调用,就没有问题。我尝试了标准的 Winforms Invoke/BeginInvoke,但没有成功。

【问题讨论】:

    标签: winforms activex multithreading


    【解决方案1】:

    我使用的是典型的 Winforms 跨线程模式:

    if(InvokeRequired)
    {
        Invoke(new Action(DoStuff));
    }
    else
    {
        DoStuff();
    }
    

    当然,我从中调用的控件不知道 AX 控件,因此我需要显式调用该操作。还需要使用BeginInvoke,所以上面变成:

    BeginInvoke(new Action(DoStuff));

    现在工作。糟糕!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2023-03-08
      相关资源
      最近更新 更多