Ошибка при попытке использовать AccessibleObjectFromWindow()

#c #winapi #dll

#c #winapi #dll

Вопрос:

Я пытаюсь использовать AccessibleObjectFromWindow() функцию, но мой main.cpp возвращает эти ошибки:

 main.cpp:24: error: undefined reference to 'IID_IAccessible'
main.cpp:27: error: undefined reference to 'AccessibleObjectFromWindow'
main.cpp:-1: error: collect2.exe: error: ld returned 1 exit status
 

main.cpp

 #include <iostream>
#include <windows.h>
#include <winuser.h>
#include <oleacc.h>
#include <OleAuto.h>

int main(int argc, char *argv[]){

    HWND lastForegroundHwnd = GetForegroundWindow();
    DWORD dwId = OBJID_CARET;
    REFIID riid = IID_IAccessible;
    void *ppvObject = NULL;

    HRESULT hResult = AccessibleObjectFromWindow(lastForegroundHwnd, dwId, riid, amp;ppvObject);

    return 0;
}
 

Кто-нибудь знает, как я могу это решить?

Комментарии:

1. Я исследовал раньше, но я не могу найти, как связать библиотеку в Qt Creator, вы знаете, как это сделать?

2. Я пробовал, но меня бросает warning: unknown pragma ignored

3. Затем обратитесь к документации по добавлению библиотек в проекты .

Ответ №1:

Для 1-й ошибки вам необходимо ввести ссылку uuid.lib .

Для 2-й ошибки вам нужно ввести ссылку Oleacc.lib , недостаточно просто включить oleacc.h .

См. раздел Добавление библиотек в проекты в документации Qt Creator .

Или вы можете использовать #pragma comment(lib, "filename.lib") инструкции в своем коде, например:

 #pragma comment(lib, "uuid.lib")
#pragma comment(lib, "Oleacc.lib")
 

Кстати, вам не нужно использовать переменные для параметров dwId и riid , просто передайте их напрямую (особенно riid в частности). Но что более важно, вам нужно объявить ppvObject как IAccessible* , а не как void* , например:

 IAccessible *ppvObject = NULL;
HRESULT hResult = AccessibleObjectFromWindow(lastForegroundHwnd, OBJID_CARET, IID_IAccessible, (void**)amp;ppvObject);
 

Лучшим вариантом является использование IID_PPV_ARGS() вместо этого макроса, пусть он обрабатывает параметры riid and ppvObject для вас, например:

 IAccessible *ppvObject = NULL;
HRESULT hResult = AccessibleObjectFromWindow(lastForegroundHwnd, OBJID_CARET, IID_PPV_ARGS(amp;ppvObject));
 

Комментарии:

1. Извините, где я могу получить uuid.lib Oleacc.lib файлы и?

2. @andegraph они являются частью Windows SDK, так же, как oleacc.h . Если у вас есть этот .h файл, у вас тоже должны быть .lib файлы. Выполните поиск в своей системе и убедитесь, что пути поиска вашего компилятора настроены правильно.