我最近问过以下问题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标志时神奇地起作用,但这并不是接受答案所必需的。如果你能做到这两点,你会最深切的感谢:)
答案 0 :(得分:0)
尝试使用 MTA(调用 CoInitializeEx(NULL, COINIT_MULTITHREADED))。