MSAA不在主线程中产生新的行为

时间:2015-04-11 01:36:29

标签: multithreading qt com atl

我在Qt中遇到了Microsoft Active Accessibility和线程的问题。代码如下:

CComPtr<IAccessible> _pAccMain;
HWND _hWnd = ...; // Handle of some window
HRESULT hr0 = ::AccessibleObjectFromWindow(_hWnd,
                                              OBJID_CLIENT,
                                              IID_IAccessible,
                                              (void**)(&_pAccMain));
long childCount = 0;

HRESULT hr1 = _pAccMain->get_accChildCount(&childCount);

它工作正常,在主线程中这些函数返回hr0和hr1的成功,我得到了_pAccMain和childCount的正确成功数据。但是当我创建一个新线程并尝试使用该新线程中的代码时,我再次获得了hr0和hr1的成功,但我在_pAccMain和childCount中获得了不同的数据。即相同的代码在不同的线程中有多个行为。

为什么另一个线程在该示例中有另一个行为?

我该如何解决它的行为?

我能解决吗?

2 个答案:

答案 0 :(得分:1)

  • 没有承诺AccessibleObjectFromWindow调用返回相同的接口指针,因此_pAccMain值不必是指针相等的
  • 此外,从不同的线程(公寓)调用可能会涉及编组,在这种情况下,您可能会获得代理接口,而不是真正的对象接口;设计行为是那些不同的指针
  • 通过提及不同的childCount,你应该提到工作线程是否为零,或者在子枚举中究竟有什么不同
  • COM中的线程之间没有自由的COM指针传递,你的问题表明你在做什么;你只能使用MTA线程执行此操作,否则你必须编组/解组指针以在另一个线程中获取有效指针

答案 1 :(得分:0)

似乎Qt在每个新线程中悄悄地初始化了COM,之后CoInitializeEx与任何COINIT都无法对它做任何事情。但如果你在CoInitializeEx之前调用新的QThread CoUnitialize一切都会好的,那对我有用。