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

10-13 04:41
查看更多