MinGW,g ++,winapi,winsdk,迷失了方向

我试图调用GetPhysicalCusrorPos()用g ++(mingw)编译,结果certificate我的sdk已经过时了。 所以我去下载了最新的w32api的MinGW,但是这个function还是从头文件中丢失了…所以我开始用下面的问题search,只是为了得到越来越多的丢失:

_当你想使用Windows API而使用MinGW时,w32api是达到它的唯一方法吗?

_什么是Windows API,Windows SDK,w32api,MinGW和w32api之间的完全关系?

gnu工具(MinGW gcc,g ++等)可以和VisualC / WinSDK(cl.exe)一样吗?

请不要以为我没有find答案,我当然做了,但是我发现所有不同的答案都比帮助我更多。 如果有人能够澄清一切对于像我这样的初学者都是非常好的。

非常感谢 !

据我了解,与mingw编译器一起使用MS SDK是不实际的。 你必须使用明确的特定的SDK。 甚至最新的mingw版本似乎都不支持GetPhysicalCursorPos

由于您只需要这一个功能,或者只需要这一个功能,也可以自己提供一些功能。 例如:

 #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):undefined 
引用`__imp_GetPhysicalCursorPos'
 collect2.exe:错误:ld返回1退出状态

所以我们需要找到一个链接器能够解析符号的方法。 理论上你可以让连接器ld直接链接到dll。 但是我一直无法得到这个工作。 相反,你可以使用一些更加费力的方法。

制作一个.def文件来定义这个函数所在的user32库的导出:

 LIBRARY user32.dll
 EXPORTS
     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