2010-03-25 12 views
6

Potrzebuję zalogować informacje o tym, ile pamięci RAM ma użytkownik. Moim pierwszym podejściem było użycie GlobalMemoryStatusEx, ale to tylko daje mi ile pamięci jest dostępnej dla Windows, a nie ile jest zainstalowanych. Znalazłem tę funkcję GetPhysicallyInstalledSystemMemory, ale jej jedyną Vista i później. Potrzebuję tego do pracy nad XP. Czy istnieje dość prosty sposób sprawdzania informacji SMBIOS używanych przez GetPhysicallyInstalledSystemMemory lub czy istnieje gdzieś wartość rejestru, którą mogę znaleźć.Jak mogę się dowiedzieć, ile pamięci jest fizycznie zainstalowane w systemie Windows?

Odpowiedz

2

EDIT: użyję odpowiedź steelbytes', ale jeśli nie można użyć WMI Z jakiegoś powodu, można to zrobić :

Nie wierzę, że wersje systemu Windows wcześniejszego niż Vista śledzą te informacje - należy wykonać specyficzne dla systemu wyliczenie systemu BIOS lub płyty głównej, aby znaleźć prawdziwą wartość sprzed systemu Vista. Najlepiej jest zadzwonić do nowego API, GetPhysicallyInstalledSystemMemory, i przejść do wersji GlobalMemoryStatusEx dla systemów XP.

1

Jedną z wartości zwróconych przez GlobalMemoryStatusEx jest ullTotalPhys, która wydaje się być tym, czego szukasz.

Rzeczy takie jak ram używany do pamięci wideo nie ma tam, ale wątpię, jest sposób, aby w ogóle do tego dojść.

+0

Dlaczego ta odpowiedź została odrzucona? Powtarza to pytanie innymi słowami. –

4

Powinieneś rzucić okiem na właściwość Class (WMI) i TotalPhysicalMemory klasy. Istnieją sposoby uzyskiwania dostępu do tych informacji przez .Net poprzez przestrzeń nazw System.Management dla zarządzanego kodu (używam C#, więc nie próbowałem używać Visual Studio do rozwoju C++). Można również utworzyć skrypt do bezpośredniego uruchamiania usługi WMI, a program C++ wywoła skrypt.

AKTUALIZACJA: Możesz również zajrzeć do klasy Win32_PhysicalMemory (spójrz na właściwość Pojemność). Pozwoli to złagodzić niedokładne odczyty spowodowane BIOS za pomocą niektórych RAM itp

UPDATE 2:

Próbowałem to w C# (3.5) i Windows XP (SP 2) i to działa. Jestem pewien, że możesz zrobić coś podobnego z tymi samymi klasami WMI w C++ (przynajmniej przez Visual Studio). Nie stanowi to problemu, więc nie jest to problem związany z Vistą lub większą. Nie jestem pewien, czy jest to dokładnie to, czego szukasz, ale ten kod zwróci całkowitą pojemność pamięci fizycznej systemu (nie ile jest za darmo). Mam nadzieję, że właśnie to miałeś na myśli. W każdym razie tu jest jakiś przykładowy kod, który lokalizuje każdy kij RAM i wyświetla niektóre informacje na temat każdego z nich (w tym pojemności), a następnie całkowita u dołu:

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

użyć kodu:

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

Przykładowe dane z mojej maszyny:

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

Ma to ten sam problem, co wywołanie "GlobalMemoryStatusEx". –

+0

Wiele właściwości określa, czy nie są one obsługiwane w określonej wersji systemu Windows (lub przed określoną wersją).Żadna z tych właściwości, o których wspomniałem, nie mówi, że są to tylko Vista lub więcej. To nie znaczy, że są one obsługiwane w XP (nie próbowałem siebie). –

+0

Podejrzewam, że połączenia wewnątrz Win32_ComputerSystem sprowadzają się do wywołań GlobalMemoryStatusEx. Ale wyliczenie Win32_PhysicalMemory powinno działać na wszystkich systemach. +1 dla aktualizacji. –