我试图调用 GetPhysicalCusrorPos() 用 g++ (mingw) 编译,结果我的 sdk 已经过时了。所以我去下载了最新的 w32api 的最后一个 MinGW,但是这个功能仍然从头文件中丢失......所以我开始搜索以下问题,结果却越来越迷失:
_ 当您想使用 Windows API 但使用 MinGW 时,w32api 是达到它的好方法吗?
_ Windows API、Windows SDK、w32api、MinGW 和 w32api 之间到底是什么关系???
_ gnu 工具(MinGW、gcc、g++ 等)可以像 VisualC/WinSDK (cl.exe) 一样吗???
请不要以为我没有在寻找答案,我确实在寻找答案,但是我找到的所有不同答案使我失去的比它们对我的帮助更大。
如果有人能澄清这一切,那对像我这样迷路的初学者来说会非常好。
非常感谢 !
最佳答案
据我了解,将 MS SDK 与 mingw 编译器一起使用是不切实际的。您必须使用 mingw 特定的 SDK。即使是最新的 mingw 版本似乎也不支持 GetPhysicalCursorPos
。
由于您只需要这个函数,或者可能需要这个函数和其他一些函数,因此您可以很容易地自己提供 SDK 的缺失部分。例如:
#define WINVER 0x0600
#include <windows.h>
#include <iostream>
extern "C"
{
__declspec(dllimport) BOOL WINAPI GetPhysicalCursorPos(LPPOINT lpPoint);
}
int main()
{
POINT pt;
if (GetPhysicalCursorPos(&pt))
{
std::cout << pt.x << ", " << pt.y << std::endl;
}
}
在这里,我们包含了我们希望调用的 API 的声明。当您编译它时,您会收到以下错误:
>g++ main.cpp -o main.exe
>C:\Users\xxx\AppData\Local\Temp\ccCCZZEk.o:main.cpp:(.text+0x1d): 未定义
对“__imp_GetPhysicalCursorPos”的引用
collect2.exe:错误:ld 返回 1 个退出状态
所以我们需要找到一种方法让链接器能够解析符号。理论上,您可以要求链接器 ld 直接链接到 DLL。但我一直无法让它发挥作用。相反,您可以使用更费力的方法。
创建一个 .def 文件来定义这个函数所在的 user32 库的导出:
库 user32.dll
导出
GetPhysicalCursorPos = __imp_GetPhysicalCursorPos
将其保存到名为 myuser32.def 的文件中。现在,这不是 user32 导出的所有函数,但我们只需要 mingw 附带的导入库中缺少的函数。
现在使用 dlltool 制作一个导入库:
>dlltool -d myuser32.def -l myuser32.a
然后编译通过导入库:
>g++ main.cpp myuser32.a -o main.exe
这次成功了。当我们运行程序时:
>主要
1302, 670
关于c++ - MinGW、g++、winapi、winsdk、迷茫,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20389408/