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 一切都会好的,它对我有用。
我对 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 一切都会好的,它对我有用。