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

MSAA not in the main thread produce new behavior

我对 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);

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

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

我该如何修复它的行为?

我可以修好吗?

  • 没有保证 AccessibleObjectFromWindow 调用 return 相同的接口指针,因此 _pAccMain 值不必与指针相等
  • 此外,从不同的线程(单元)调用可能涉及封送处理,在这种情况下,您可能会得到一个代理接口,而不是真正的对象接口;这些是不同的指针是设计行为
  • 通过提及不同 childCount 你应该提到如果工作线程让你为零,否则在子枚举中到底有什么不同
  • 在 COM 中的线程之间没有自由的 COM 指针传递,你的问题表明你在做什么;您只能使用 MTA 线程执行此操作,否则您必须 marshal/unmarshal 指针才能在另一个线程
  • 中获取有效指针

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