2010-03-25 18 views
6

Necesito registrar información sobre la cantidad de RAM que tiene el usuario. Mi primer enfoque fue utilizar GlobalMemoryStatusEx, pero eso solo me da la cantidad de memoria disponible para Windows, no la cantidad que está instalada. Encontré esta función GetPhysicallyInstalledSystemMemory pero es solo Vista y posterior. Necesito esto para trabajar en XP. ¿Existe una forma bastante simple de consultar la información de SMBIOS que GetPhysicallyInstalledSystemMemory estaba usando o hay un valor de registro en alguna parte que puedo encontrarlo?¿Cómo puedo saber cuánta memoria está físicamente instalada en Windows?

Respuesta

2

EDIT: me gustaría usar respuesta Steelbytes', pero si no se puede utilizar WMI Por alguna razón, usted puede hacer esto :

No creo que las versiones de Windows anteriores a Vista sigan esta información: tendrías que hacer una enumeración de BIOS o placa base específica del sistema para encontrar el verdadero valor antes de Vista. Su mejor opción es llamar a la nueva API, GetPhysicallyInstalledSystemMemory, y pasar a GlobalMemoryStatusEx para sistemas XP.

1

Uno de los valores devueltos por GlobalMemoryStatusEx es ullTotalPhys, que parece ser lo que está buscando.

Las cosas como el ram utilizado para la memoria de video no están ahí, pero dudo que haya una manera de llegar a eso.

+0

¿Por qué esta respuesta es votada? Simplemente repite la pregunta en diferentes palabras. –

4

Debería echar un vistazo a la clase Win32_ComputerSystem (WMI) y la propiedad TotalPhysicalMemory. Hay formas de acceder a esta información a través de .Net a través del espacio de nombres System.Management para código administrado (yo uso C#, así que no he intentado usar Visual Studio para el desarrollo de C++). También podría crear un script para ejecutar WMI directamente y hacer que su programa C++ llame al script.

ACTUALIZACIÓN: También puede consultar la clase Win32_PhysicalMemory (eche un vistazo a la propiedad Capacidad). Esto aliviará lecturas inexactas debido a la BIOS con algunos de la memoria RAM, etc.

ACTUALIZACIÓN 2:

He intentado esto en C# (3.5) y Windows XP (SP 2) y funciona. Estoy seguro de que puedes hacer algo similar con las mismas clases de WMI en C++ (al menos a través de Visual Studio). No funciona, así que no es un problema de Vista o mayor. No estoy seguro de si esto es exactamente lo que está buscando, pero este código devolverá la capacidad total de la memoria física del sistema (no cuánto es gratis). Espero que esto es lo que querías decir. De todos modos aquí es un código de ejemplo que localiza cada palo de memoria RAM y muestra algo de información acerca de cada uno (incluyendo la capacidad) y luego el total en la parte inferior:

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); 
     } 
    } 
} 

para usar el código:

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

Ejemplo de salida de mi máquina:

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 
+0

Esto tiene los mismos problemas que la llamada 'GlobalMemoryStatusEx'. –

+0

Muchas de las propiedades indican si no son compatibles con una versión determinada de Windows (o antes de una versión en particular).Ninguna de estas propiedades que he mencionado indica que solo son Vista o más. Eso no quiere decir que sean compatibles con XP aunque (no lo he probado). –

+0

Sospecho que las llamadas dentro de Win32_ComputerSystem simplemente se reducen a llamadas GlobalMemoryStatusEx. Pero la enumeración Win32_PhysicalMemory debería funcionar en todos los sistemas. +1 para la actualización. –

Cuestiones relacionadas