我试图调用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