Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: IAccessible: метод get_accRole не вернул ROLE_SYSTEM_APPLICATION  (Прочитано 4014 раз)
0 Пользователей и 1 Гость смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 04-05-2012 13:16 » 

Взял функцию из одной 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.


Код: (C++)
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`!
Что за чудеса в решете...
« Последнее редактирование: 05-05-2012 14:39 от malor » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines