MinGW GCC无法识别MEMSTATUSEX?

时间:2012-12-11 21:37:25

标签: c api winapi gcc mingw

我在Windows 7上使用MinGW GCC编译器。我正在尝试编译包含以下代码的源代码:

MEMORYSTATUSEX mem_stat;
mem_stat.dwLength = sizeof(memstat);
BOOL success = GlobalMemoryStatusEx(mem_stat);
ram_ptr = &(mem_stat->ullAvailPhys);

我确信你可以猜到,这段代码只是使用GlobalMemoryStatusEx返回的MEMORYSTATUSEX结构获取可用内存。

当我尝试编译时,我收到此错误:

error: unknown type name 'MEMORYSTATUSEX'

我查看了winbase.h(在MinGW安装包含文件夹中)并猜测我发现了什么?

#if (_WIN32_WINNT >= 0x0500)
typedef struct _MEMORYSTATUSEX {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    DWORDLONG ullTotalPhys;
    DWORDLONG ullAvailPhys;
    DWORDLONG ullTotalPageFile;
    DWORDLONG ullAvailPageFile;
    DWORDLONG ullTotalVirtual;
    DWORDLONG ullAvailVirtual;
    DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX,*LPMEMORYSTATUSEX;
#endif

所以就在那里。我猜这与预编译器if / endif有关,但我不知道如何解决这个问题....

更令人头疼的是,如果我使用MEMORYSTATUS结构,它可以正常工作。

根据MS文档,两者都具有相同的最低客户端版本要求:

MEMORYSTATUSEX: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366589%28v=vs.85%29.aspx

MEMORYSTATUS: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366772%28v=vs.85%29.aspx

我需要设置一些编译器标志吗?或者有没有人有其他解决方案?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在包含Windows.h之前,添加:

#define WINVER 0x0500

头文件windef.h说:

/*
 * If you need Win32 API features newer the Win95 and WinNT then you must
 * define WINVER before including windows.h or any other method of including
 * the windef.h header.
 */

然后使用-std = c ++ 11标志进行编译,如:

g++ -Wall -std=c++11 -c <yourFile>.cpp -o <yourFile>.o

答案 1 :(得分:0)

显然你必须自己定义_WIN32_WINNT作为你的一个头/源文件中的编译器标志或定义语句,以使这个特定的函数正常工作。

添加#define _WIN32_WINNT 0x0500将允许代码正常编译。