GlobalMemoryStatus()函数获取内存信息与dos下的systeminfo不一致的问题

babihehe 2012-06-07 10:17:27
我在vs2008下调用GlobalMemoryStatus()函数获取内存信息,代码如下:
MEMORYSTATUS ms; //记录内容空间信息的结构体变量

//调用GlobalMemoryStatus()函数获取内存信息
GlobalMemoryStatus(&ms);

cout<<"total physical mem:"<<(float)ms.dwTotalPhys/1024/1024<<"MB"<<endl; //总的物理内存大小
cout<<"used physical mem:"<<(float)(ms.dwTotalPhys - ms.dwAvailPhys)/1024/1024<<"MB"<<endl; //已用物理内存大小
cout<<"avilible physical mem:"<<(float)ms.dwAvailPhys/1024/1024<<"MB"<<endl; //可用物理内存大小
cout<<endl;
cout<<"total Virtual mem:"<<(float)ms.dwTotalVirtual/1024/1024<<"MB"<<endl; //总的虚拟内存大小
cout<<"used Virtual mem:"<<(float)(ms.dwTotalVirtual-ms.dwAvailVirtual)/1024/1024<<"MB"<<endl; //已用虚拟内存大小
cout<<"avilible Virtual mem:"<<(float)ms.dwAvailVirtual/1024/1024<<"MB"<<endl; //可用虚拟内存大小
运行结果如下:
总物理内存:2048MB
可用物理内存:828.055MB
总虚拟内存:2047.88MB
可用虚拟内存:2021.42MB

但是,我在运行下通过systeminfo指令获取的内存信息为:
物理内存总量:3062MB
可用物理内存:833MB
虚拟内存:最大值:6121MB
虚拟内存:可用:1469MB
虚拟内存:使用中:4652MB

我电脑是WIN7系统,我装了了虚拟机,虚拟机内存是1G。我想问一下:
1、程序获取的内存对么?
2、怎样获取和dos指令一样的信息,有这个必要么
谢谢大家
...全文
516 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
朵小豆在学习 2013-12-11
  • 打赏
  • 举报
回复
引用 1 楼 wingzero520 的回复:
GlobalMemoryStatus 识别不了大于 2GB 的内存,应该用 GlobalMemoryStatusEx
我的内存4G,GlobalMemoryStatus函数依然可以识别
南风不冕 2013-12-06
  • 打赏
  • 举报
回复
学习了,请问GlobalMemoryStatus里面这个dwMemoryLoad 是按最高2G的总内存计算的吗
dragoo1 2013-09-09
  • 打赏
  • 举报
回复
学习了...
babihehe 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
GlobalMemoryStatus 识别不了大于 2GB 的内存,应该用 GlobalMemoryStatusEx
[/Quote]
又出现新的问题了,我把代码改为:
MEMORYSTATUSEX ms; //记录内容空间信息的结构体变量
ZeroMemory(&ms,sizeof(MEMORYSTATUSEX));

//调用GlobalMemoryStatusEx()函数获取内存信息
GlobalMemoryStatusEx(&ms);

发现没有获取到任何东西,就是ms内容都为0。麻烦看一下是什么问题,我觉得应该没有问题的。
赵4老师 2012-06-07
  • 打赏
  • 举报
回复
system("systeminfo >si.txt");
//然后读文件si.txt的内容
(^_^)
wingzero520 2012-06-07
  • 打赏
  • 举报
回复
GlobalMemoryStatus 识别不了大于 2GB 的内存,应该用 GlobalMemoryStatusEx
babihehe 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 3 楼 的回复:

引用 1 楼 的回复:
GlobalMemoryStatus 识别不了大于 2GB 的内存,应该用 GlobalMemoryStatusEx

又出现新的问题了,我把代码改为:
MEMORYSTATUSEX ms; //记录内容空间信息的结构体变量
ZeroMemory(&amp;ms,sizeof(MEMORYSTATUSEX));

//调用……
[/Quote]

嗯嗯,对,就是这个原因。我看msdn的时候太粗心了。谢谢
babihehe 2012-06-07
  • 打赏
  • 举报
回复
找到原因了:
1、如一楼(wingzero520)所说,我应该用GlobalMemoryStatusEx;
2、而我在三楼之所以出现获取失败的问题,是因为我定义了MEMORYSTATUSEX ms后,需要对结构体的dwLength进行赋值,它表示结构体大小,然后才可以使用GlobalMemoryStatusEx。由于我用ZeroMemory(&ms,sizeof(MEMORYSTATUSEX))这一句,导致dwLength值为0,所以总是获取失败,用GetLastError获取的结果为参数错误。
最后,谢谢各位的帮助,结贴啦
CandPointer 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:
GlobalMemoryStatus 识别不了大于 2GB 的内存,应该用 GlobalMemoryStatusEx

又出现新的问题了,我把代码改为:
MEMORYSTATUSEX ms; //记录内容空间信息的结构体变量
ZeroMemory(&ms,sizeof(MEMORYSTATUSEX));

//调用GlobalMemorySta……
[/Quote]



typedef struct _MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

Members

dwLength

The size of the structure, in bytes. You must set this member before calling GlobalMemoryStatusEx.
CandPointer 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:
GlobalMemoryStatus 识别不了大于 2GB 的内存,应该用 GlobalMemoryStatusEx

又出现新的问题了,我把代码改为:
MEMORYSTATUSEX ms; //记录内容空间信息的结构体变量
ZeroMemory(&ms,sizeof(MEMORYSTATUSEX));

//调用GlobalMemorySta……
[/Quote]

MEMORYSTATUSEX statex;

statex.dwLength = sizeof (statex);

GlobalMemoryStatusEx (&statex);
babihehe 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
那就看看函数的详细介绍吧,或者用软件来检测看看结果
[/Quote]
嗯,好的,谢谢
prohibit 2012-06-07
  • 打赏
  • 举报
回复
那就看看函数的详细介绍吧,或者用软件来检测看看结果
babihehe 2012-06-07
  • 打赏
  • 举报
回复
我又加分了,我的等级最高只能加到100分,希望大家不要说我小气。帮我看看问题吧。谢谢
babihehe 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
system("systeminfo >si.txt");
//然后读文件si.txt的内容
(^_^)
[/Quote]

嗯,又学了一招,谢谢高手。
但是我的代码为什么不行呢?我想不明白

65,202

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧