UIAutomation: AddAutomationEventHandler() возвращает E_POINTERC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 UIAutomation: AddAutomationEventHandler() возвращает E_POINTER

Сообщение Anonymous »

Я использую UIAutomation для получения URL-адреса в адресной строке активного браузера. Я начинаю с браузера Firefox.
CUIAutomation — это, по сути, класс для работы с объектом CUIAutomation, который реализует IUIAutomationFocusChangedEventHandler и IUIAutomationEventHandler

Код: Выделить всё

CUIAutomation::CUIAutomation()
{
HRESULT hr = S_OK;

hr = pAutomation_.CoCreateInstance(__uuidof(CUIAutomation), NULL, CLSCTX_INPROC_SERVER);

pAutomation_->CreateCacheRequest(&propertyCache_);

propertyCache_->AddProperty(UIA_NamePropertyId);
propertyCache_->AddProperty(UIA_ControlTypePropertyId);
propertyCache_->AddProperty(UIA_IsPasswordPropertyId);
propertyCache_->AddProperty(UIA_ProcessIdPropertyId);
propertyCache_->AddProperty(UIA_AutomationIdPropertyId);
propertyCache_->put_AutomationElementMode(AutomationElementMode_None);

hr = EnableEvents();
}
Когда я пытаюсь добавить какой-либо обработчик событий к моему объекту автоматизации, я всегда получаю ошибку E_POINTER
Например, следующий код завершается с ошибкой.

Код: Выделить всё

HRESULT STDMETHODCALLTYPE CUIAutomation::QueryInterface(REFIID riid, void** ppInterface)
{
if (riid == __uuidof(IUnknown))
*ppInterface = static_cast(this);
else if (riid == __uuidof(IUIAutomationFocusChangedEventHandler))
*ppInterface = static_cast(this);
else if (riid == __uuidof(IUIAutomationEventHandler))
*ppInterface = static_cast(this);
else
{
*ppInterface = NULL;
return E_NOINTERFACE;
}

this->AddRef();
return S_OK;
}

HRESULT STDMETHODCALLTYPE CUIAutomation::HandleFocusChangedEvent(IUIAutomationElement *sender)
{
HRESULT hr = S_OK;

controlTypeId_ = 0;
isPassword_ = FALSE;
processId_ = 0;
logged_ = false;

// these work
sender->get_CachedControlType(&controlTypeId_);
sender->get_CachedIsPassword(&isPassword_);
sender->get_CachedProcessId(&processId_);
sender->get_CachedName(&name_);
sender->get_CachedAutomationId(&automationId_);

if (watchedElement_ == NULL)
{
PROPERTYID watchedProperties_[] = { UIA_ControlTypePropertyId };

if (automationId_ == "urlbar-input")
{
// this returns E_POINTER
hr = pAutomation_->AddAutomationEventHandler(UIA_Text_TextChangedEventId, sender, TreeScope_Element, NULL, this);
if (SUCCEEDED(hr))
{
watchedElement_ = sender;
}
}
}

return S_OK;
}
Я пробовал разные области дерева, а также передавал кеш.
У меня та же проблема с AddPropertyChangedEventHandler
В AddAutomationEventHandler передано только два указателя: отправитель и this.
ОБНОВЛЕНИЕ. В отладчике я могу подтвердить, что это действительно и вызывается QueryInterface и возвращается допустимый IUIAutomationEventHandler*. должен быть действительным, поскольку я могу получить кэшированные свойства.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -e-pointer
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»