准确地获取物理内存

Susiria 2008-09-08 09:50:41
大家好!公司有100多台WinXP主机,我的程序需要获取这些机器的内存大小,但是我发现无论是使用Win32 API还是WMI,
所获取的内存大小都不够准确。当然这个不够准确并不是指类似2G和2.2G,2.3G这样的误差,在许多情况下误差高达1G,2G。
Solution1: Win32 API
使用GlobalMemoryStatusEx函数,所得到的结果与右击我的电脑->属性里面的相同。问题是当物理内存大于3G的时候便不能获取真实值,有好几台8G和4G的电脑都显示为3.5G。代码如下:

//API声明
[DllImport("kernel32.dll", SetLastError = true)]
static extern void GlobalMemoryStatusEx(ref MemoryStatusEx lpBuffer);
//忽略其他细节
MemoryStatusEx mem = new MemoryStatusEx();
mem.DwLength = sizeof(int) * 2 + sizeof(long) * 7;
GlobalMemoryStatusEx(ref mem);


Win32 API原本还有MemoryStatus函数,但是更不易获取真实值,故略。
Solution2: WMI

使用"SELECT * FROM Win32_PhysicalMemory"查询,得到的"Capacity"值就是单根内存的容量。不知为什么,使用这个方法的误差很大,有时候4G的容量只能读出2G。代码如下:

//使用WMI
ManagementScope ms = new ManagementScope();
ms.Connect();
ObjectQuery oq = new ObjectQuery();
oq.QueryString = "SELECT * FROM Win32_PhysicalMemory";
ManagementObjectSearcher sercher = new ManagementObjectSearcher(ms, oq);
ManagementObjectCollection memMoc = sercher.Get();
long capacityTemp = 0;
foreach (ManagementObject mo in memMoc)
{
//内存总量等于所有插槽上内存容量之和
capacityTemp += Convert.ToInt64(mo["Capacity"].ToString());
}

另外公司的显卡都是独立的,因此不应该出现划出部分内存作为显存的情况。
麻烦大家帮我看看^_^

...全文
365 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenwt7 2008-12-11
  • 打赏
  • 举报
回复
32位.......
Susiria 2008-09-09
  • 打赏
  • 举报
回复
thanks
再见品月 2008-09-09
  • 打赏
  • 举报
回复
up。。XP支持不了8G,4G.
最多也就3G多一点点。。。

有钱也不是这么花地。。

硬给它8G的内存。。。XP会死机,蓝屏。。啥情况都有可能发生
liangchencf 2008-09-09
  • 打赏
  • 举报
回复
32位的机器识别不了那么大的内存,最大好像是3.2G
mywisest 2008-09-09
  • 打赏
  • 举报
回复

/// <summary>
/// 物理内存大小。
/// </summary>
public static uint PhysicalMemory
{
get
{
if(!_isGetMemoryInfo)
{
memInfo = new MemoryInfo();
GlobalMemoryStatus(ref memInfo);
_isGetMemoryInfo = true;
}
return memInfo.dwTotalPhys;
}
}
[DllImport("kernel32")]
private static extern void GlobalMemoryStatus(ref MemoryInfo memInfo);
[StructLayout(LayoutKind.Sequential)]
internal struct MemoryInfo
{
internal uint dwLength;
internal uint dwMemoryLoad;
internal uint dwTotalPhys;
internal uint dwAvailPhys;
internal uint dwTotalPageFile;
internal uint dwAvailPageFile;
internal uint dwTotalVirtual;
internal uint dwAvailVirtual;
}
viki117 2008-09-09
  • 打赏
  • 举报
回复
XP貌似好象最多也就能识别到2G+吧。。起码32位的XP。。你给他8G他也识别不到的
kbryant 2008-09-09
  • 打赏
  • 举报
回复
帮顶
优途科技 2008-09-09
  • 打赏
  • 举报
回复
有关于内存的属性字段:
"FreePhysicalMemory" //空闲物理内存
"FreeVirtualMemory" //空闲虚拟内存
"TotalVisibleMemorySize" //物理内存总数
"TotalVirtualMemorySize" //虚拟内存总数
wuyi8808 2008-09-08
  • 打赏
  • 举报
回复
up
sno888 2008-09-08
  • 打赏
  • 举报
回复


定义一个 ManagementClass(公共信息模型管理类) ,并将类的路径设定为 "Win32_OperatingSystem",使用 GetInstances() 方法来获得它的 ManagementObject 集合。

ManagementClass 每次创建一条线程,所在的方法执行完毕后即被释放。


有关于内存的属性字段:
"FreePhysicalMemory" //空闲物理内存
"FreeVirtualMemory" //空闲虚拟内存
"TotalVisibleMemorySize" //物理内存总数
"TotalVirtualMemorySize" //虚拟内存总数

bill_hai 2008-09-08
  • 打赏
  • 举报
回复
会C#或.net或PDA的 有没有想找工作的?
我帮公司招人。
13021989954

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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