基本概念

GlobalMemoryStatusExWindows系统中用于检索有关系统当前物理内存和虚拟内存使用情况信息的API函数,属于系统资源监控类API。它比早期的GlobalMemoryStatus功能更强大,支持检测超过4GB的内存(适用于64位系统和大内存场景),是现代Windows应用中获取内存信息的首选接口。

基本语法

1
2
3
BOOL GlobalMemoryStatusEx(
[in, out] LPMEMORYSTATUSEX lpBuffer // 指向MEMORYSTATUSEX结构体的指针,用于接收内存信息
);

LPMEMORYSTATUSEX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct _MEMORYSTATUSEX {
DWORD dwLength; // 结构体大小(必须手动初始化)
DWORD dwMemoryLoad; // 内存使用率(百分比)
DWORDLONG ullTotalPhys; // 物理内存总量(字节)
DWORDLONG ullAvailPhys; // 可用物理内存(字节)
DWORDLONG ullTotalPageFile; // 页面文件总容量(字节)
DWORDLONG ullAvailPageFile; // 可用页面文件容量(字节)
DWORDLONG ullTotalVirtual; // 用户模式虚拟内存总容量(字节)
DWORDLONG ullAvailVirtual; // 可用用户模式虚拟内存(字节)
DWORDLONG ullAvailExtendedVirtual; // 扩展虚拟内存(通常为0)
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

DWORDLONG:typedef unsigned __int64 DWORDLONG;
无符号 64 位整数数据类型。

简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <windows.h>
#include <stdio.h>

int main() {
// 1. 定义并初始化MEMORYSTATUSEX结构体
MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX); // 必须初始化,否则调用失败

// 2. 调用函数获取内存信息
if (!GlobalMemoryStatusEx(&memInfo)) {
printf("调用失败!错误码:%lu\n", GetLastError());
return 1;
}

// 3. 解析并打印内存信息(转换为GB便于阅读)
printf("=== 系统内存状态 ===\n");
printf("内存使用率:%lu%%\n", memInfo.dwMemoryLoad);

printf("物理内存总量:%.2f GB\n", (double)memInfo.ullTotalPhys / (1024 * 1024 * 1024));
printf("可用物理内存:%.2f GB\n", (double)memInfo.ullAvailPhys / (1024 * 1024 * 1024));

printf("页面文件总量:%.2f GB\n", (double)memInfo.ullTotalPageFile / (1024 * 1024 * 1024));
printf("可用页面文件:%.2f GB\n", (double)memInfo.ullAvailPageFile / (1024 * 1024 * 1024));

printf("用户虚拟内存总量:%.2f GB\n", (double)memInfo.ullTotalVirtual / (1024 * 1024 * 1024));
printf("可用用户虚拟内存:%.2f GB\n", (double)memInfo.ullAvailVirtual / (1024 * 1024 * 1024));

return 0;
}