2010-03-25 41 views
6

Tôi cần đăng nhập thông tin về lượng RAM mà người dùng có. Cách tiếp cận đầu tiên của tôi là sử dụng GlobalMemoryStatusEx nhưng điều đó chỉ mang lại cho tôi bao nhiêu bộ nhớ có sẵn cho các cửa sổ, không phải là bao nhiêu được cài đặt. Tôi tìm thấy chức năng này GetPhysicallyInstalledSystemMemory nhưng chỉ có Vista của nó và sau đó. Tôi cần điều này để làm việc trên XP. Có cách khá đơn giản để truy vấn thông tin SMBIOS mà GetPhysicallyInstalledSystemMemory đang sử dụng hoặc là có một giá trị đăng ký ở đâu đó mà tôi có thể tìm thấy điều này.Làm cách nào để tìm hiểu dung lượng bộ nhớ được cài đặt trong Windows?

Trả lời

2

EDIT: Tôi muốn sử dụng câu trả lời steelbytes', nhưng nếu bạn không thể sử dụng WMI Đối với một số lý do, bạn có thể làm điều này :

Tôi không tin các phiên bản Windows trước Vista theo dõi thông tin này - bạn phải thực hiện một số BIOS cụ thể hoặc bảng liệt kê Bo mạch chủ để tìm giá trị đích thực trước Vista. Đặt cược tốt nhất của bạn là gọi API mới, GetPhysicallyInstalledSystemMemory và không thành công đến GlobalMemoryStatusEx cho các hệ thống XP.

1

Một trong các giá trị được trả về bởi GlobalMemoryStatusEx là ullTotalPhys, có vẻ như bạn đang tìm kiếm.

Những thứ như ram được sử dụng cho bộ nhớ video không có trong đó, nhưng tôi nghi ngờ có một cách để có được điều đó cả.

+0

Tại sao câu trả lời này được upvoted? Nó chỉ đơn giản là đặt câu hỏi theo những từ khác nhau. –

4

Bạn nên xem qua số Win32_ComputerSystem Lớp (WMI) và thuộc tính TotalPhysicalMemory. Có nhiều cách để truy cập thông tin này thông qua .Net qua không gian tên System.Management cho mã được quản lý (Tôi sử dụng C#, vì vậy tôi chưa thử sử dụng studio trực quan để phát triển bản thân C++). Bạn cũng có thể tạo một kịch bản để chạy WMI trực tiếp và có chương trình C++ của bạn gọi kịch bản lệnh.

CẬP NHẬT: Bạn cũng có thể xem Lớp học Win32_PhysicalMemory (hãy xem thuộc tính Dung lượng). Điều này sẽ làm giảm bớt đọc không chính xác do BIOS sử dụng một số RAM, vv

UPDATE 2:

Tôi đã thử điều này trong C# (3.5) và Windows XP (SP 2) và nó hoạt động. Tôi chắc rằng bạn có thể làm một cái gì đó tương tự với các lớp WMI cùng trong C + + (ít nhất là thông qua Visual Studio). Nó hoạt động không có vấn đề, do đó, nó không phải là một vấn đề Vista hoặc lớn hơn. Tôi không chắc chắn nếu điều này là chính xác những gì bạn đang tìm kiếm, nhưng mã này sẽ trả về tổng dung lượng bộ nhớ vật lý của hệ thống (không bao nhiêu là miễn phí). Hy vọng rằng đây là những gì bạn có ý nghĩa. Dù sao đây là một số mẫu mã để định vị từng dính RAM và hiển thị một số thông tin về mỗi người (bao gồm cả khả năng) và sau đó tổng ở dưới cùng:

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

Để sử dụng mã:

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

Đầu ra mẫu từ máy của tôi:

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

Điều này có cùng sự cố với lệnh gọi 'GlobalMemoryStatusEx'. –

+0

Nhiều thuộc tính cho biết có hay không chúng không được hỗ trợ trong một phiên bản Windows cụ thể (hoặc trước một phiên bản cụ thể).Cả hai thuộc tính này mà tôi đã đề cập không chỉ là Vista hoặc cao hơn. Đó không phải là để nói rằng họ được hỗ trợ trong XP mặc dù (đã không cố gắng bản thân mình). –

+0

Tôi nghi ngờ các cuộc gọi bên trong Win32_ComputerSystem chỉ đơn giản là đun sôi xuống cuộc gọi GlobalMemoryStatusEx. Nhưng kiểu liệt kê Win32_PhysicalMemory sẽ hoạt động trên tất cả các hệ thống. +1 để cập nhật. –

Các vấn đề liên quan