MSAA Automation get_accChildCount for Infragistics UltraWinTree仅在CLR下运行时才有效

时间:2016-02-23 14:38:34

标签: c++ .net c++-cli accessibility ui-automation

我最近问过以下问题MSAA UI Automation get_accChildCount Incorrectly Returning 0 for Infragistics UltraTree in Winforms,并发现了一个令人不满意的答案,这就是提出这个问题的原因。

情况如下:

进程1:C#/ WinForms应用程序显示一个带有Infragistics UltraWinTree的UI窗口,该窗口具有值为" hwnd"的句柄。

进程2:C ++代码,用于检索UltraWinTree的可访问子级数,该子级具有值为" hwnd"的句柄。使用以下C ++代码调用MSAA

IAccessible* accessibleObj;
AccessibleObjectFromWindow(hwnd, OBJID_CLIENT, IID_IAccessible, (void**)&accessibleObj);
long childCount;
accessibleObj->get_accChildCount(&childCount);

如果使用指定了/ clr编译器标志的Microsoft C ++编译器构建了进程2(将代码编译为.NET MSIL而不是汇编),则childCount是正确的数字。如果它是在没有指定/ clr编译器标志的情况下构建的,那么childCount是一个不正确的数字,并且在调用GetLastError后调用AccessibleObjectFromWindow会返回2(这似乎是"找不到文件&# 34。)

为什么只有在指定了编译器的/ clr标志时,这个C ++代码才能工作?

修改

要真正具体到我要找的答案,我的主要目标是让这些代码以C ++的形式运行。因此,如果有一些方法可以使这个C ++代码无需使用Microsoft C ++编译器上的/ clr选项就可以接受答案。

我真的很想知道为什么它在翻转/ clr标志时神奇地起作用,但这并不是接受答案所必需的。如果你能做到这两点,你会最深切的感谢:)

1 个答案:

答案 0 :(得分:0)

尝试使用 MTA(调用 CoInitializeEx(NULL, COINIT_MULTITHREADED))。