我需要記錄用戶有多少內存的信息。我的第一個方法是使用GlobalMemoryStatusEx,但只給了我多少內存可用於Windows,而不是多少安裝。我發現這個函數GetPhysicallyInstalledSystemMemory,但它只有Vista和更高版本。我需要這個在XP上工作。是否有一種相當簡單的方法來查詢GetPhysicallyInstalledSystemMemory正在使用的SMBIOS信息,或者是否存在我可以找到的某處的註冊表值。如何找出在Windows中物理安裝了多少內存?
回答
編輯:我會用steelbytes'的答案,但如果你不能使用WMI出於某種原因,你可以這樣做:
我不相信Vista之前的Windows版本會跟蹤這些信息 - 您必須執行一些系統特定的BIOS或主板枚舉才能找到Vista之前的真實值。您最好的選擇是調用新的API GetPhysicallyInstalledSystemMemory
,並將故障轉移到XP系統的GlobalMemoryStatusEx
。
GlobalMemoryStatusEx返回的值之一是ullTotalPhys,這似乎是你正在尋找的。
像用於視頻內存的內存不在那裏,但我懷疑有一種方法可以達到這一點。
我認爲WMI可以給你這個信息...
http://briandesmond.com/blog/getting-total-installed-memory-with-wmi/
哦 - 希望我會想到這一點。 +1。 – 2010-03-25 14:43:09
我不確定這是XP的友好與否...只是想我會把它作爲一個想法發佈:-) – SteelBytes 2010-03-25 14:44:09
它是。應該適用於XP機器。 – 2010-03-25 14:44:52
您應該查看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
這與GlobalMemoryStatusEx調用有相同的問題。 – 2010-03-25 14:44:24
許多屬性聲明它們是否在特定版本的Windows(或特定版本之前)中不受支持。我提到的這些屬性都沒有說明它們只是Vista或更高版本。這並不是說他們在XP支持,但(沒有嘗試過自己)。 – 2010-03-25 15:03:22
我懷疑Win32_ComputerSystem內的調用簡單歸結爲GlobalMemoryStatusEx調用。但Win32_PhysicalMemory枚舉應該適用於所有系統。 +1進行更新。 – 2010-04-08 13:58:24
- 1. Linux如何知道進程使用了多少物理內存?
- 2. 如何找出緩存當前消耗了多少內存?
- 3. 找出一個進程在linux中使用多少額外的物理內存
- 4. 找出線程使用了多少內存
- 5. 找出iPhone有多少內存?
- 6. 如何檢查在Windows系統上安裝了多少.Net應用程序?
- 7. PEAR安裝了內存
- 8. 如何找出linux下的空閒物理內存量(c)
- 9. 在Windows下讀取物理內存8
- 10. 別名在Windows上的物理內存
- 11. 物理內存地址,在Windows
- 12. 如何找出我是否在Linux中安裝了Python模塊?
- 13. 如何在Java中查找物理內存大小?
- 14. 如何減少Matlab中的物理內存增加?
- 15. 如何減少SQL Server中的物理內存使用量
- 16. 如何從安裝了IE的Windows註冊表中查找?
- 17. 安裝時出現此錯誤。如何在windows中安裝gulp?
- 18. 如何找出在Windows 7上安裝了哪個版本的SMB
- 19. 如何在linux中打印出物理內存的大小
- 20. 如何在Windows中安裝
- 21. 找出C#中的對象正在使用多少內存?
- 22. 在Ruby中安裝較少 - Windows
- 23. 如何安裝python物理引擎
- 24. 致命錯誤:類 '內存緩存' 未找到(安裝了PECL)
- 25. 如何在Windows上安裝多個JDK?
- 26. 如何找出在Ubuntu上安裝了哪個版本的GTK +?
- 27. 根據給定的參數,JVM使用多少物理內存?
- 28. 如何發現系統上安裝了多少RAM?
- 29. 軟件如何知道它安裝了多少次?
- 30. MATLAB:如何查看.m文件中使用了多少內存?
爲什麼這個答案被upvoted?它只是用不同的詞語來重述這個問題。 – 2010-03-25 14:43:32