首先来看看实现的效果:
【单条内存条内存的情况】
【所有内存条内存的情况】
其实获取这些信息,非常简单,和Hello World一样简单。不信,就来看看。
获取单条内存条的内存情况的API函数为:GlobalMemoryStatus
获取所有内存条的内存的情况的API函数为:GlobalMemoryStatusEx
后者是前者的增强版。最早只有GlobalMemoryStatus函数,因为那时候内存很贵,而且都是一个内存条,这个函数就可以很好的满足了。后来内存越来越大,然后出现了多条内存条的情况,所以出现了GlobalMemoryStatusEx。如果你用GlobalMemoryStatus去获取所有内存情况,那是不对的。这一点需要说明清楚,以免浪费时间想这个问题。
GlobalMemoryStatus函数接受信息的结构体为MEMORYSTATUS,GlobalMemoryStatusEx函数接受信息的结构体为MEMORYSTATUSEX。这两个函数只有一个参数,就是他们对应的结构体变量地址。然后你就可以在结构体变量读取获取到的各种信息,也就是图中看到的这些信息。非常简单。
不过需要注意的是,MEMORYSTATUSEX在使用前,需要设置一下结构体大小成员,代码如下:
MEMORYSTATUSEX status;
status.dwLength = sizeof(MEMORYSTATUSEX);//不能漏掉了,否则获取不到正确的数据
获取内存信息的代码为:
//单内存条
MEMORYSTATUS status;
GlobalMemoryStatus(&status);
//多内存条
MEMORYSTATUSEX status;
status.dwLength = sizeof(MEMORYSTATUSEX);//不能漏掉了,否则获取不到正确的数据
GlobalMemoryStatusEx(&status);
信息都在结构体变量里,我们看看结构体的声明:
typedef struct _MEMORYSTATUS {
DWORD dwLength;
DWORD dwMemoryLoad;
SIZE_T dwTotalPhys;
SIZE_T dwAvailPhys;
SIZE_T dwTotalPageFile;
SIZE_T dwAvailPageFile;
SIZE_T dwTotalVirtual;
SIZE_T dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS;
typedef struct _MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
两个结构体的声明也差不多,就是数据类型和成员的名称有点不一样,EX版本多了一个成员。各个成员的含义,见下面的格式化信息代码:
CString str;
str.Format(_T("【单条内存条】内存使用比例:%d%%\n总物理内存:%.2f GB - 可用物理内存:%.2f GB\n总虚拟内存:%.2f GB - 可用虚拟内存:%.2f GB\n总页文件: %.2f GB - 可用页文件: %.2f GB"),
status.dwMemoryLoad,status.dwTotalPhys/1024.0/1024.0/1024.0,status.dwAvailPhys/1024.0/1024.0/1024.0,status.dwTotalVirtual/1024.0/1024.0/1024.0,status.dwAvailVirtual/1024.0/1024.0/1024.0,status.dwTotalPageFile/1024.0/1024.0/1024.0,status.dwAvailPageFile/1024.0/1024.0/1024.0);
CString str;
str.Format(_T("【所有内存条】内存使用比例:%d%%\n总物理内存:%.2f GB - 可用物理内存:%.2f GB\n总虚拟内存:%.2f GB - 可用虚拟内存:%.2f GB\n总页文件: %.2f GB - 可用页文件: %.2f GB\n可用扩展虚拟内存:%.2f"),
status.dwMemoryLoad,status.ullTotalPhys/1024.0/1024.0/1024.0,status.ullAvailPhys/1024.0/1024.0/1024.0,status.ullTotalVirtual/1024.0/1024.0/1024.0,status.ullAvailVirtual/1024.0/1024.0/1024.0,status.ullTotalPageFile/1024.0/1024.0/1024.0,status.ullAvailPageFile/1024.0/1024.0/1024.0,status.ullAvailExtendedVirtual/1024.0/1024.0/1024.0);
自己对应一下,成员名字一看就懂了。