2010-03-25 15 views
6

मुझे इस बारे में जानकारी लॉग इन करने की आवश्यकता है कि उपयोगकर्ता के पास कितनी रैम है। मेरा पहला दृष्टिकोण ग्लोबलमेमरीस्टैटसएक्स का उपयोग करना था, लेकिन यह केवल मुझे देता है कि विंडोज़ में कितनी मेमोरी उपलब्ध है, न कि कितना स्थापित है। मैंने यह फ़ंक्शन GetPhysicallyInstalledSystemMemory पाया लेकिन इसका एकमात्र विस्टा और बाद में। मुझे XP पर काम करने की ज़रूरत है। क्या SMBIOS की जानकारी पूछने का एक बहुत ही सरल तरीका है जो GetPhysicallyInstalledSystemMemory का उपयोग कर रहा था या वहां कहीं रजिस्ट्री मान है जिसे मैं इसे ढूंढ सकता हूं।मैं कैसे पता लगा सकता हूं कि विंडोज़ में कितनी मेमोरी शारीरिक रूप से स्थापित है?

उत्तर

2

संपादित करें: मैं steelbytes 'जवाब का उपयोग करेंगे, लेकिन यदि आप किसी कारण से WMI उपयोग नहीं कर सकते, तो आप ऐसा कर सकते हैं :

मुझे विश्वास नहीं है कि विस्टा से पहले विंडोज संस्करण इस जानकारी को ट्रैक करते हैं - आपको Vista से पहले सही मूल्य खोजने के लिए कुछ सिस्टम विशिष्ट BIOS या मदरबोर्ड गणना करना होगा। आपकी सबसे अच्छी शर्त नई एपीआई, GetPhysicallyInstalledSystemMemory पर कॉल करना है, और XP सिस्टम के लिए GlobalMemoryStatusEx पर विफल होना है।

1

GlobalMemoryStatusEx द्वारा दिए गए मानों में से एक ullTotalPhys है, जो कि आप जो खोज रहे हैं वह प्रतीत होता है।

वीडियो मेमोरी के लिए उपयोग की जाने वाली रैम जैसी चीजें वहां नहीं हैं, लेकिन मुझे संदेह है कि इसे पाने का कोई तरीका है।

+0

यह उत्तर क्यों उठाया जा रहा है? यह सिर्फ अलग-अलग शब्दों में प्रश्न को पुन: स्थापित करता है। –

2

मुझे लगता है कि WMI आप इस जानकारी दे सकते हैं ...

http://briandesmond.com/blog/getting-total-installed-memory-with-wmi/

+0

ओह - इच्छा है कि मैंने इस बारे में सोचा होगा। +1। –

+0

मुझे यकीन नहीं है कि यह एक्सपी अनुकूल है या नहीं ... बस सोचा कि मैं इसे एक विचार के रूप में पोस्ट करूंगा :-) – SteelBytes

+0

यह है। एक्सपी मशीनों के लिए काम करना चाहिए। –

4

आपको Win32_ComputerSystem कक्षा (WMI) और TotalPhysicalMemory प्रॉपर्टी पर एक नज़र डालना चाहिए। प्रबंधित जानकारी के लिए System.Management नेमस्पेस के माध्यम से .NET के माध्यम से इस जानकारी तक पहुंचने के तरीके हैं (मैं सी # का उपयोग करता हूं, इसलिए मैंने सी ++ विकास के लिए दृश्य स्टूडियो का उपयोग करने की कोशिश नहीं की है)। आप सीधे WMI चलाने के लिए एक स्क्रिप्ट भी बना सकते हैं और अपना सी ++ प्रोग्राम स्क्रिप्ट को कॉल कर सकते हैं।

अद्यतन: आप Win32_PhysicalMemory कक्षा (क्षमता संपत्ति पर नज़र डालें) देख सकते हैं। यह राम आदि में से कुछ का उपयोग कर BIOS के कारण गलत रीडिंग कम होगा

अद्यतन 2:

मैं सी # (3.5) और Windows XP (सपा 2) और यह काम करता में यह कोशिश की है। मुझे यकीन है कि आप सी ++ (कम से कम विजुअल स्टूडियो के माध्यम से) में एक ही WMI कक्षाओं के समान कुछ कर सकते हैं। यह कोई समस्या नहीं करता है, इसलिए यह Vista या अधिक समस्या नहीं है। मुझे यकीन नहीं है कि यह वही है जो आप खोज रहे हैं, लेकिन यह कोड सिस्टम की कुल भौतिक स्मृति क्षमता को वापस कर देगा (कितना मुफ्त नहीं है)। उम्मीद है कि यह तुम्हारा मतलब है। वैसे भी यहां कुछ नमूना कोड है कि राम के प्रत्येक छड़ी पता लगाता है और (क्षमता सहित) हर एक के बारे में कुछ जानकारी प्रदर्शित करता है और है तो निचले हिस्से की कुल:

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 के किसी विशेष संस्करण (या किसी विशेष संस्करण से पहले) में समर्थित नहीं हैं या नहीं।इन गुणों में से कोई भी मैंने राज्य का उल्लेख नहीं किया है कि वे केवल विस्टा या अधिक हैं। ऐसा नहीं है कि वे XP में समर्थित हैं (हालांकि मैंने कोशिश नहीं की है)। –

+0

मुझे संदेह है कि Win32_ComputerSystem के अंदर कॉल बस GlobalMemoryStatusEx कॉल पर उबाल लें। लेकिन Win32_PhysicalMemory गणना सभी प्रणालियों पर काम करना चाहिए। अद्यतन के लिए +1। –

संबंधित मुद्दे

 संबंधित मुद्दे