Взял функцию из одной
MFC-программы.
Но внутри неё что-то аномально идет. Переменная в определенный момент получает совершенно неподобающее значение.
Почему?
Внутри исходной программы:
Согласно
Windows Application UI Development > Accessibility > Windows Automation API > Microsoft Active Accessibility >
C/C++ Reference > Active Accessibility User Interface Services > Constants > Object Roles:
14 - ROLE_SYSTEM_APPLICATION
The object represents a main window for an application.Внутри новой программы:
10 - ROLE_SYSTEM_CLIENT
The object represents a window's client area. Microsoft Active Accessibility uses this role
as a default if there is a question about the role of a UI element.BOOL EnumAccessible_2(HWND hwnd)
//=============================================================================
{
BOOL bRet = FALSE;
_ASSERTE (::IsWindow(hwnd));
if (::IsWindow(hwnd))
{
IAccessible *pIAccParent = NULL;
HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible, (void**)&pIAccParent);
if (SUCCEEDED(hr) && pIAccParent)
{
VARIANT varChild;
VariantInit(&varChild);
IAccessible *pIAccChild = NULL;
//********************************************************
IEnumVARIANT *pEnum = NULL;
IAccessible *pCAcc = NULL;
HRESULT hr = pIAccParent->QueryInterface(IID_IEnumVARIANT, (PVOID*) &pEnum);
if (pEnum)
pEnum->Reset();
long nChildren = 0;
unsigned long nFetched = 0;
pIAccParent->get_accChildCount(&nChildren);
// nChildren равен 4
VariantClear(&varChild);
SAFE_RELEASE(pCAcc);
if (pEnum)
{
hr = pEnum->Next(1, &varChild, &nFetched);
hr = pEnum->Next(1, &varChild, &nFetched);
hr = pEnum->Next(1, &varChild, &nFetched);
hr = pEnum->Next(1, &varChild, &nFetched); // Сразу до 4-го ребенка добираемся
}
IDispatch *pDisp = NULL;
if (varChild.vt == VT_I4)
{
hr = pIAccParent->get_accChild(varChild, &pDisp);
}
if (pDisp)
{
hr = pDisp->QueryInterface(IID_IAccessible, (void**)&pCAcc);
}
if (pCAcc)
{
VariantInit(&varChild);
varChild.vt = VT_I4;
varChild.lVal = CHILDID_SELF;
pIAccChild = pCAcc;
}
UINT nRole = 0;
if (pIAccChild && &varChild)
{
VARIANT *pvarChild = &varChild;
VARIANT varRole;
VariantInit(&varRole);
// ПЕРЕМЕННАЯ `varRole` ВЫДАЕТ РАЗНЫЕ ЗНАЧЕНИЯ
HRESULT hr = pIAccChild->get_accRole(varChild, &varRole);
if (SUCCEEDED(hr) && (varRole.vt == VT_I4))
{
nRole = varRole.lVal;
}
VariantClear(&varRole);
}
//********************************************************
SAFE_RELEASE(pIAccParent);
VariantClear(&varChild);
bRet = TRUE;
}
}
return bRet;
}
Входящий параметр
`hwnd` - идентичен в обоих случаях.
Убираю из
MFC-программы все конструкции, относящиеся к
'MFC'.
Запускаю. А теперь и исходная программа стала выдавать значение
`ROLE_SYSTEM_CLIENT`!
Что за чудеса в решете...