Как я могу узнать, сколько памяти физически установлено в Windows?

Я должен зарегистрировать информацию о том, сколько RAM пользователь имеет. Мой первый подход должен был использовать GlobalMemoryStatusEx, но который только дает мне, сколько памяти доступно окнам, не, сколько установлено. Я нашел этот функциональный GetPhysicallyInstalledSystemMemory, но его единственную Vista и позже. Мне нужно это для работы над XP. Есть ли довольно простой способ запросить информацию SMBIOS, которую GetPhysicallyInstalledSystemMemory использовал или является там значением реестра где-нибудь, что я могу узнать это.

6
задан Randall 25 March 2010 в 14:30
поделиться

4 ответа

РЕДАКТИРОВАТЬ: Я бы использовал ответ Steelbytes, но если вы не можете использовать WMI По какой-то причине вы можете сделать это:

Я не верю, что версии Windows до Vista отслеживают эту информацию - вы ' Чтобы найти истинное значение, предшествующее Vista, мне нужно будет выполнить перечисление BIOS или материнской платы для конкретной системы. Лучше всего вызвать новый API, GetPhysicallyInstalledSystemMemory , и переключиться на GlobalMemoryStatusEx для систем XP.

2
ответ дан 10 December 2019 в 02:45
поделиться

Я думаю, WMI может предоставить вам эту информацию ...

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

2
ответ дан 10 December 2019 в 02:45
поделиться

Одним из значений, возвращаемых GlobalMemoryStatusEx, является ullTotalPhys, что, похоже, именно то, что вы ищете.

Здесь нет таких вещей, как оперативная память, используемая для видеопамяти, но я сомневаюсь, что есть способ добраться до этого вообще.

1
ответ дан 10 December 2019 в 02:45
поделиться

Вам следует взглянуть на Win32_ComputerSystem Class (WMI) и свойство TotalPhysicalMemory. Есть способы получить доступ к этой информации через .Net через пространство имен System.Management для управляемого кода (я использую C#, поэтому сам не пробовал использовать visual studio для разработки на c++). Вы также можете создать скрипт для прямого запуска WMI и заставить вашу программу на c++ вызывать этот скрипт.

UPDATE: Вы также можете посмотреть на класс Win32_PhysicalMemory (посмотрите на свойство Capacity). Это поможет избежать неточных показаний из-за того, что BIOS использует часть оперативной памяти и т.д.

UPDATE 2:

Я попробовал это в C# (3.5) и Windows XP (SP 2), и это работает. Я уверен, что вы можете сделать что-то подобное с теми же классами WMI в C++ (по крайней мере, через Visual Studio). Все работает без проблем, так что это не проблема Vista или выше. Я не уверен, что это именно то, что вы ищете, но этот код вернет общий объем физической памяти системы (а не сколько свободно). Надеюсь, это то, что вы имели в виду. В любом случае, вот пример кода, который находит каждую плашку оперативной памяти и отображает некоторую информацию о каждой из них (включая объем), а затем общий объем внизу:

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
4
ответ дан 10 December 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: