如何查看 Windows 中实际安装了多少内存?

问题描述 投票:0回答:4

我需要记录有关用户拥有多少 RAM 的信息。我的第一个方法是使用

GlobalMemoryStatusEx
但这只能告诉我 Windows 可用的内存量,而不是安装的内存量。我发现了这个功能
GetPhysicallyInstalledSystemMemory
但只有Vista及更高版本。我需要这个才能在 XP 上运行。有没有一种相当简单的方法来查询
GetPhysicallyInstalledSystemMemory
正在使用的 SMBIOS 信息,或者是否有一个注册表值可以让我找到。

c++ memory system
4个回答
5
投票

您应该查看 Win32_ComputerSystem 类 (WMI) 和 TotalPhysicalMemory 属性。有多种方法可以通过 .Net 通过托管代码的 System.Management 命名空间访问此信息(我使用 C#,所以我自己没有尝试使用 Visual Studio 进行 C++ 开发)。您还可以创建一个脚本来直接运行 WMI,并让您的 C++ 程序调用该脚本。

更新:您还可以查看 Win32_PhysicalMemory 类(查看“容量”属性)。这将减少由于 BIOS 使用部分 RAM 等导致的读数不准确的情况。

更新2:

我已经在 C# (3.5) 和 Windows XP (SP 2) 中尝试过此操作,并且它有效。我确信您可以使用 C++ 中的相同 WMI 类执行类似的操作(至少通过 Visual Studio)。它工作没有问题,所以这不是 Vista 或更严重的问题。我不确定这是否正是您正在寻找的,但此代码将返回系统的总物理内存容量(而不是空闲的量)。希望这就是你的意思。无论如何,这里有一些示例代码,用于定位每根 RAM 并显示有关每根 RAM 的一些信息(包括容量),然后在底部显示总数:

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace WmiTest
{
    public class RamCounter
    {
        private List<RamStick> _ramSticks;
        private int _totalRam;
        private StringBuilder _stringRepresentation;

        public RamCounter()
        {
            _ramSticks = new List<RamStick>();
            _totalRam = 0;
            _stringRepresentation = new StringBuilder();
        }

        public void GetRamSticks()
        {
            _ramSticks.Clear();
            _totalRam = 0;

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory");
            ManagementObjectCollection queryCollection = searcher.Get();

            foreach (ManagementObject mo in queryCollection)
            {
                _ramSticks.Add(
                    new RamStick(Convert.ToUInt64(mo.GetPropertyValue("Capacity")),
                                 mo.GetPropertyValue("DeviceLocator").ToString(),
                                 mo.GetPropertyValue("Description").ToString(),
                                 Convert.ToUInt32(mo.GetPropertyValue("FormFactor")),
                                 Convert.ToUInt32(mo.GetPropertyValue("Speed"))));
            }
        }

        public override string ToString()
        {
            _stringRepresentation.Capacity = 0;

            foreach (RamStick rs in _ramSticks)
            {
                _stringRepresentation.Append(rs.ToString());
                _totalRam += rs.CapacityInMB;
            }

            _stringRepresentation.Append("Total RAM(MB): " + _totalRam);
            return _stringRepresentation.ToString();
        }
    }

    public class RamStick
    {
        private UInt64 _capacity;
        private UInt32 _formFactor;

        public RamStick(UInt64 capacity, string location, string description, UInt32 formFactor, UInt32 speed)
        {
            _capacity = capacity;
            Location = location;
            Description = description;
            _formFactor = formFactor;
            Speed = speed;
        }

        public int CapacityInMB
        {
            get { return Convert.ToInt32(_capacity / (1024 * 1024)); }
        }

        public string Location
        {
            get;
            private set;
        }

        public string Description
        {
            get;
            private set;
        }

        public string GetFormFactor()
        {
            string formFactor = string.Empty;

            switch (_formFactor)
            {
                case 1:
                    formFactor = "Other";
                    break;

                case 2:
                    formFactor = "SIP";
                    break;

                case 3:
                    formFactor = "DIP";
                    break;

                case 4:
                    formFactor = "ZIP";
                    break;

                case 5:
                    formFactor = "SOJ";
                    break;

                case 6:
                    formFactor = "Proprietary";
                    break;

                case 7:
                    formFactor = "SIMM";
                    break;

                case 8:
                    formFactor = "DIMM";
                    break;

                case 9:
                    formFactor = "TSOP";
                    break;

                case 10:
                    formFactor = "PGA";
                    break;

                case 11:
                    formFactor = "RIMM";
                    break;

                case 12:
                    formFactor = "SODIMM";
                    break;

                case 13:
                    formFactor = "SRIMM";
                    break;

                case 14:
                    formFactor = "SMD";
                    break;

                case 15:
                    formFactor = "SSMP";
                    break;

                case 16:
                    formFactor = "QFP";
                    break;

                case 17:
                    formFactor = "TQFP";
                    break;

                case 18:
                    formFactor = "SOIC";
                    break;

                case 19:
                    formFactor = "LCC";
                    break;

                case 20:
                    formFactor = "PLCC";
                    break;

                case 21:
                    formFactor = "BGA";
                    break;

                case 22:
                    formFactor = "FPBGA";
                    break;

                case 23:
                    formFactor = "LGA";
                    break;

                default:
                    formFactor = "Unknown";
                    break;
            }

            return formFactor;
        }

        public UInt32 Speed
        {
            get;
            private set;
        }

        public override string ToString()
        {
            return string.Format("Description:{1}{0}" 
                               + "Location:{2}{0}"
                               + "Form Factor:{3}{0}"
                               + "Speed:{4}{0}"
                               + "Capacity(MB):{5}{0}{0}",

                               Environment.NewLine,
                               Description,
                               Location,
                               GetFormFactor(),
                               Speed,
                               CapacityInMB);
        }
    }
}

使用代码:

private void btnRam_Click(object sender, EventArgs e)
{
    RamCounter rc = new RamCounter();
    rc.GetRamSticks();
    MessageBox.Show(rc.ToString());
}

我的机器的输出示例:

Description: Physical Memory
Location: J6H1
Format Factor: DIMM
Speed: 667
Capacity(MB): 1024

Description: Physical Memory
Location: J6H2
Format Factor: DIMM
Speed: 667
Capacity(MB): 1024

Description: Physical Memory
Location: J6J1
Format Factor: DIMM
Speed: 667
Capacity(MB): 1024

Total RAM(MB): 3072

3
投票

编辑:我会使用steelbytes的答案,但如果由于某种原因你不能使用WMI,你可以这样做:

我不相信 Vista 之前的 Windows 版本会跟踪此信息 - 您必须执行一些特定于系统的 BIOS 或主板枚举才能找到 Vista 之前的真实值。对于 XP 系统,最好的选择是调用新 API

GetPhysicallyInstalledSystemMemory
,并故障转移到
GlobalMemoryStatusEx


2
投票

我认为 WMI 可能会给你这个信息......

http://briandesmond.com/blog/getting-total-installed-memory-with-wmi/


1
投票

GlobalMemoryStatusEx 返回的值之一是 ullTotalPhys,这似乎就是您正在寻找的值。

用于视频内存的内存之类的东西不在那里,但我怀疑是否有办法实现它。

© www.soinside.com 2019 - 2024. All rights reserved.