【问题标题】:Error trying to use AccessibleObjectFromWindow()尝试使用 AccessibleObjectFromWindow() 时出错
【发布时间】:2021-03-01 20:24:27
【问题描述】:

我正在尝试使用 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, &ppvObject);

    return 0;
}

有谁知道我该如何解决这个问题?

【问题讨论】:

  • 我之前一直在研究,但是在Qt Creator中找不到如何链接库,你知道怎么做吗?
  • 我试过了,但把我扔了warning: unknown pragma ignored
  • 然后参考Adding Libraries to Projects文档。

标签: c++ winapi dll


【解决方案1】:

对于第一个错误,您需要链接到uuid.lib

对于第二个错误,你需要链接Oleacc.lib,仅仅包括oleacc.h是不够的。

请参阅 Qt Creator 文档中的 Adding Libraries to Projects

或者,您可以在代码中使用#pragma comment(lib, "filename.lib") 语句,例如:

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

附带说明,您不需要为dwIdriid 参数使用变量,只需将它们直接传递(尤其是riid)。但更重要的是,您需要将ppvObject 声明为IAccessible*,而不是void*,例如:

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

更好的选择是改用IID_PPV_ARGS() 宏,让它为您处理riidppvObject 参数,例如:

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

【讨论】:

  • 抱歉,我在哪里可以获得 uuid.libOleacc.lib 文件?
  • @andegraph 它们是 Windows SDK 的一部分,与 oleacc.h 相同。如果你有 .h 文件,你也应该有 .lib 文件。搜索您的系统,并确保您的编译器的搜索路径配置正确。
猜你喜欢
  • 2017-07-18
  • 2017-02-08
  • 2018-12-02
  • 2020-09-07
  • 2021-09-14
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多