我试图用g ++(mingw)调用GetPhysicalCusrorPos()编译,结果发现我的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): undefined reference to `__imp_GetPhysicalCursorPos' collect2.exe: error: ld returned 1 exit status
因此,我们需要找到一种方法让链接器能够解析符号.理论上,您可以要求链接器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
这次成功.当我们运行程序时:
>main 1302, 670