c++ - MinGW,g++,winapi,winsdk,迷茫中

标签 c++ windows winapi mingw

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

关于c++ - MinGW,g++,winapi,winsdk,迷茫中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389408/

相关文章:

c++ - 我可以对(非成员)函数使用部分模板特化吗?

windows - 特殊字符导致 Windows 批处理文件关闭

windows - Powershell:循环遍历现有变量以使某些变量不可见

windows - 单击 bin 目录中的可执行文件时,Visual Studio UWP 未启动

python - 从 Python 代码创建单个 exe 文件

c++ - 使用 WINAPI ReadFile 从文件异步读取行

c++ - 为什么这里不调用移动分配

C++ 最健壮的文件复制方式

c++ - 指针和 C 风格数组变量的专用模板

c++ - C/C++ 通用控件检测 TVItem 的双击