2010-03-25 62 views
6

我需要記錄用戶有多少內存的信息。我的第一個方法是使用GlobalMemoryStatusEx,但只給了我多少內存可用於Windows,而不是多少安裝。我發現這個函數Ge​​tPhysicallyInstalledSystemMemory,但它只有Vista和更高版本。我需要這個在XP上工作。是否有一種相當簡單的方法來查詢GetPhysicallyInstalledSystemMemory正在使用的SMBIOS信息,或者是否存在我可以找到的某處的註冊表值。如何找出在Windows中物理安裝了多少內存?

回答

2

編輯:我會用steelbytes'的答案,但如果你不能使用WMI出於某種原因,你可以這樣做:

我不相信Vista之前的Windows版本會跟蹤這些信息 - 您必須執行一些系統特定的BIOS或主板枚舉才能找到Vista之前的真實值。您最好的選擇是調用新的API GetPhysicallyInstalledSystemMemory,並將故障轉移到XP系統的GlobalMemoryStatusEx

1

GlobalMemoryStatusEx返回的值之一是ullTotalPhys,這似乎是你正在尋找的。

像用於視頻內存的內存不在那裏,但我懷疑有一種方法可以達到這一點。

+0

爲什麼這個答案被upvoted?它只是用不同的詞語來重述這個問題。 – 2010-03-25 14:43:32

4

您應該查看Win32_ComputerSystem類(WMI)和TotalPhysicalMemory屬性。有許多方法可以通過.Net通過System.Management命名空間爲託管代碼訪問這些信息(我使用C#,所以我沒有嘗試使用Visual Studio for C++開發自己)。你也可以創建一個腳本來直接運行WMI並讓你的C++程序調用腳本。

更新:您也可以看看Win32_PhysicalMemory類(看一下Capacity屬性)。這將使用一些RAM等的緩解讀數不準確由於BIOS

更新2:

我在C#(3.5)和Windows XP(SP 2)和它的作品嚐試過這一點。我相信你可以在C++中使用相同的WMI類(至少通過Visual Studio)做類似的事情。它沒有問題,所以它不是一個Vista或更大的問題。我不確定這是否正是您正在尋找的內容,但此代碼將返回系統的總物理內存容量(而不是多少空閒)。希望這是你的意思。反正這裏是定位的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 
+0

這與GlobalMemoryStatusEx調用有相同的問題。 – 2010-03-25 14:44:24

+0

許多屬性聲明它們是否在特定版本的Windows(或特定版本之前)中不受支持。我提到的這些屬性都沒有說明它們只是Vista或更高版本。這並不是說他們在XP支持,但(沒有嘗試過自己)。 – 2010-03-25 15:03:22

+0

我懷疑Win32_ComputerSystem內的調用簡單歸結爲GlobalMemoryStatusEx調用。但Win32_PhysicalMemory枚舉應該適用於所有系統。 +1進行更新。 – 2010-04-08 13:58:24

相關問題