2010-03-25 2 views
6

사용자의 RAM 용량에 대한 정보를 기록해야합니다. 내 첫 번째 접근 방식은 GlobalMemoryStatusEx를 사용하는 것이지만, 얼마나 많은 메모리가 윈도우에 제공되는지, 얼마만큼 설치되었는지는 알 수 없다. 이 함수는 GetPhysicallyInstalledSystemMemory가 있지만 Vista 만 지원합니다. XP에서 작동하려면이 기능이 필요합니다. GetPhysicallyInstalledSystemMemory가 사용하고있는 SMBIOS 정보를 쿼리하는 간단한 방법이 있습니까? 아니면이 값을 찾을 수있는 레지스트리 값이 있습니까?Windows에 실제로 얼마나 많은 메모리가 설치되어 있는지 어떻게 알 수 있습니까?

답변

2

편집 : 나는 steelbytes '대답을 사용하려고하지만 어떤 이유로 WMI를 사용할 수없는 경우, 당신은이 작업을 수행 할 수 있습니다 :

Vista 이전의 Windows 버전이이 정보를 추적한다고 생각지 않습니다. Vista 이전의 진정한 가치를 찾으려면 시스템 특정 BIOS 또는 마더 보드 열거를해야합니다. 가장 좋은 방법은 새로운 API 인 GetPhysicallyInstalledSystemMemory을 호출하고 XP 시스템의 경우 GlobalMemoryStatusEx으로 페일 오버하는 것입니다.

1

GlobalMemoryStatusEx에 의해 반환되는 값 중 하나는 찾고있는 것처럼 보이는 ullTotalPhys입니다.

비디오 메모리에 사용되는 RAM과 같은 것은 없지만, 그럴 가능성은 전혀 없습니다. 내가 WMI 당신에게이 정보를 제공 할 수 있습니다 생각

+0

왜이 답변을 upvoted입니까? 질문을 다른 말로 간단히 말합니다. –

4

Win32_ComputerSystem 클래스 (WMI)와 TotalPhysicalMemory 속성을 살펴 봐야합니다. 관리되는 코드의 System.Management 네임 스페이스를 통해 .Net을 통해이 정보에 액세스하는 방법이 있습니다 (C#을 사용하므로 Visual Studio를 사용하여 직접 C++ 개발을 시도하지 않았습니다). WMI를 직접 실행하고 C++ 프로그램에서 스크립트를 호출하도록 스크립트를 만들 수도 있습니다.

업데이트 : Win32_PhysicalMemory 클래스를 볼 수도 있습니다 (Capacity 속성을 확인하십시오). 이것은 등 RAM의 일부를 사용 때문에 BIOS에 부정확 한 측정 값을 완화합니다

업데이트 2 : 나는 C#을 (3.5) 및 Windows XP (SP 2) 작동이 시도했습니다

. C++에서 (적어도 Visual Studio를 통해) 동일한 WMI 클래스와 비슷한 것을 할 수있을 것이라고 확신합니다. 문제가 없으므로 Vista 나 그 이상의 문제는 아닙니다. 이것이 정확하게 당신이 찾고있는 것인지 모르겠지만,이 코드는 시스템의 총 실제 메모리 용량을 반환합니다 (얼마나 많은 양은 무료가 아닙니다). 바라기를 이것은 당신이 의미 한 것입니다. 어쨌든 여기에 몇 가지 샘플 RAM의 각 스틱을 찾아서 (용량 포함) 각각에 대한 몇 가지 정보를 표시 코드는 다음 하단에있는 총 :

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

:

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

코드를 사용하려면 내 컴퓨터의 샘플 출력 :

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' 호출과 같은 문제가 있습니다. –

+0

많은 등록 정보는 특정 Windows 버전 (또는 특정 버전 이전)에서 지원되지 않는지 여부를 나타냅니다.언급 한 속성 중 어느 것도 Vista 이상인 것은 아닙니다. 그것은 그들이 XP에서 지원된다고 말하는 것이 아닙니다. (나 자신을 시도하지 않았습니다). –

+0

Win32_ComputerSystem 내부의 호출이 단순히 GlobalMemoryStatusEx 호출로 바뀐 것으로 의심됩니다. 그러나 Win32_PhysicalMemory 열거 형은 모든 시스템에서 작동해야합니다. +1 업데이트. –

관련 문제