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
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.
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.
Creo WMI le puede dar esta información ...
http://briandesmond.com/blog/getting-total-installed-memory-with-wmi/
Oooh - ojalá hubiera pensado en esto. +1. –
No estoy seguro si es amigable para xp o no ... solo pensé en publicarlo como una idea :-) – SteelBytes
Lo es. Debería funcionar para máquinas XP. –
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
Esto tiene los mismos problemas que la llamada 'GlobalMemoryStatusEx'. –
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). –
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. –
- 1. ¿Cómo puedo saber cuánta energía está usando mi computadora?
- 2. ¿Cómo puedo determinar cuánta memoria está usando mi programa .NET?
- 3. ¿Cómo puedo saber cuánta memoria/recursos está gastando mi script php?
- 4. ¿Cómo puedo saber cuánta memoria está consumiendo un .dominio de aplicaciones .Net?
- 5. ¿Cómo puedo saber cuánta memoria está asignada a un objeto javascript?
- 6. Cuánta memoria está bloqueada en un proceso
- 7. ¿Cómo puedo saber cuánta memoria utiliza un objeto de control en matlab
- 8. ¿Puede recordarme Memcache cuánta memoria está usando?
- 9. ¿Cuánta memoria usa realmente mi aplicación de Windows?
- 10. Desde la línea de comandos, ¿cómo saber qué versión de Firefox está instalada en Windows/Linux?
- 11. Cómo saber cuánta gente usa mi software
- 12. Averiguar cuánta memoria está usando un objeto en Python
- 13. ¿Cómo sabe free() cuánta memoria desasignar?
- 14. ¿Cuánta memoria debería poder asignar?
- 15. ¿Cómo puedo detectar qué versión de Internet Explorer está instalada?
- 16. ¿Cuánta memoria podría utilizar vm
- 17. ¿Cómo puedo verificar si Windows Installer 3.1 o una versión superior está instalada?
- 18. Cómo saber cuándo Windows está inactivo
- 19. ¿cómo puedo ver cuánta memoria está usando mi aplicación sin su presupuesto de VM?
- 20. ¿Cuánta RAM está usando realmente SQL Server?
- 21. zlib, deflate: ¿Cuánta memoria asignar?
- 22. ¿Cómo sabe MemoryCache cuánta memoria usa?
- 23. Android: ¿cómo verificar cuánta memoria queda?
- 24. Malloc -> ¿cuánta memoria ha sido asignada?
- 25. ¿Cuánta memoria usa una Hashtable?
- 26. ¿Cuánta memoria usa numpy ndarray?
- 27. ¿Cómo puedo saber cuándo WindowsFormsHost está redimensionando en WPF?
- 28. cuánta memoria toma un hilo en java
- 29. ¿Cuánta memoria tiene una constante en C?
- 30. En Objective-C, ¿cómo sabe + alloc cuánta memoria asignar?
¿Por qué esta respuesta es votada? Simplemente repite la pregunta en diferentes palabras. –