请教关于用GlobalMemoryStatus获取内存的问题

barbarian110 2011-09-23 09:20:34
是这样的,我在用GlobalMemoryStatus取系统内存时发现返回结构体MEMORYSTATUS中dwTotalPhys的值只是一个物理内存条的大小,而不是总的大小(假如有2个或以上物理内存条),但我想获得总的大小,请问各位大大该怎么做呢?还是我的取法有问题,貌似查到的资料上都是用这个API..
...全文
470 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxfyj1227 2014-01-14
  • 打赏
  • 举报
回复
/// <summary> /// 获取内存信息 /// </summary> /// <param name="meminfo"></param> [DllImport("kernel32")] public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo); [DllImport("kernel32")] public static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX stat); 两个都可以 [StructLayout(LayoutKind.Sequential)] public struct MEMORY_INFO { public uint dwLength; public uint dwMemoryLoad; public UInt64 dwTotalPhys; //总的物理内存大小 public UInt64 dwAvailPhys; //可用的物理内存大小 public UInt64 dwTotalPageFile; public UInt64 dwAvailPageFile; //可用的页面文件大小 public UInt64 dwTotalVirtual; //返回调用进程的用户模式部分的全部可用虚拟地址空间 public UInt64 dwAvailVirtual; // 返回调用进程的用户模式部分的实际自由可用的虚拟地址空间 } [StructLayout(LayoutKind.Sequential)] public struct MEMORYSTATUSEX { public uint dwLength; public uint dwMemoryLoad; public ulong ullTotalPhys; public ulong ullAvailPhys; public ulong ullTotalPageFile; public ulong ullAvailPageFile; public ulong ullTotalVirtual; public ulong ullAvailVirtual; public ulong ullAvailExtendedVirtual; } 注意看这里 MEMORY_INFO MemInfo; MemInfo = new MEMORY_INFO(); MEMORYSTATUSEX memEx = new MEMORYSTATUSEX(); memEx.dwLength = (uint)Marshal.SizeOf(typeof(MEMORYSTATUSEX)); GlobalMemoryStatusEx(ref memEx); GlobalMemoryStatus(ref MemInfo);
fxfyj1227 2014-01-14
  • 打赏
  • 举报
回复
纠正一下,不能误人,在不同位数下,struct 不同,所以最好用 IntPtr 或者 UIntPtr 兼容操作系统。
gaowei008 2013-10-30
  • 打赏
  • 举报
回复
兄弟们,这个问题最后怎么解决的?
sugood 2013-06-25
  • 打赏
  • 举报
回复
同求啊!不知楼主怎么解决的?
badaokunge 2012-03-10
  • 打赏
  • 举报
回复
怎么解决的给我说下 我也遇到这个问题了
dongxinweiyang 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hongwenjun 的回复:]
如需要阅读该回复,请登录或注册CSDN!
[/Quote]

我也碰到了这个问题
我查了下msdn 上面说GlobalMemoryStatus的物理内存最多也就返回的是2G的
你可以尝试用下 GlobalMemoryStatusEx
barbarian110 2011-09-23
  • 打赏
  • 举报
回复
已解决
barbarian110 2011-09-23
  • 打赏
  • 举报
回复
楼上的兄弟 你用红色标记的文字我都看过了啊
问题是dwTotalPhys取到的值只是一个物理内存大小啊
我刚在我机子上试的dwTotalPhys的结果是2G 我实际是2个2G的内存
我想知道怎么才能全部取到呢
hongwenjun 2011-09-23
  • 打赏
  • 举报
回复
GlobalMemoryStatus

  GlobalMemoryStatus,Win32 API函数。
  此函数用来获得当前可用的物理和虚拟内存信息,函数定义为:
  VOID GlobalMemoryStatus
  (
  LPMEMORYSTATUS lpBuffer
  );
  此函数无返回值,参数是一个指向名为MEMORYSTATUS的结构的指针。函数的返回信息会被存储在MEMORYSTATUS结构中。
  此函数用来替代用来支持16位应用程序的GetFreeSpace函数。
  应用程序应该在申请内存前调用此函数以防止影响到其他程序运行。
  这个函数的返回值是动态的,并且可能返回相同的值。
  关于MEMORYSTATUS结构:
  机构定义:
  typedef struct _MEMORYSTATUS { // mst
  DWORD dwLength; // sizeof(MEMORYSTATUS)
  DWORD dwMemoryLoad; // percent of memory in use
  DWORD dwTotalPhys; // bytes of physical memory
  DWORD dwAvailPhys; // free physical memory bytes
  DWORD dwTotalPageFile; // bytes of paging file
  DWORD dwAvailPageFile; // free bytes of paging file
  DWORD dwTotalVirtual; // user bytes of address space
  DWORD dwAvailVirtual; // free user bytes
  } MEMORYSTATUS, *LPMEMORYSTATUS;
  结构成员的含义:
  dwLength
  MEMORYSTATUS结构的大小,在调GlobalMemoryStatus函数前用sizeof()函数求得,用来供函数检测结构的版本。
  dwMemoryLoad
  返回一个介于0~100之间的值,用来指示当前系统内存的使用率。
  dwTotalPhys
  返回总的物理内存大小,以字节(byte)为单位。

  dwAvailPhys
  返回可用的物理内存大小,以字节(byte)为单位。
  dwTotalPageFile
  显示可以存在页面文件中的字节数。注意这个数值并不表示在页面文件在磁盘上的真实物理大小。
  dwAvailPageFile
  返回可用的页面文件大小,以字节(byte)为单位。
  dwTotalVirtual
  返回调用进程的用户模式部分的全部可用虚拟地址空间,以字节(byte)为单位。
  dwAvailVirtual
  返回调用进程的用户模式部分的实际自由可用的虚拟地址空间,以字节(byte)为单位。
  MEMORYSTATUS结构,
  结构的定义如下:
  MEMORYSTATUS STRUCT
  dwLength DWORD ? ;本结构的长度
  dwMemoryLoad DWORD ? ;已用内存的百分比
  dwTotalPhys DWORD ? ;物理内存总量
  dwAvailPhys DWORD ? ;可用物理内存
  dwTotalPageFile DWORD ? ;交换文件总的大小
  dwAvailPageFile DWORD ? ;交换文件中空闲部分大小
  dwTotalVirtual DWORD ? ;用户可用的地址空间
  dwAvailVirtual DWORD ? ;当前空闲的地址空间
  MEMORYSTATUS ENDS
hongwenjun 2011-09-23
  • 打赏
  • 举报
回复
帮你去 google
barbarian110 2011-09-23
  • 打赏
  • 举报
回复
高手呢
luciferisnotsatan 2011-09-23
  • 打赏
  • 举报
回复
帮顶。。

65,202

社区成员

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

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