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
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.
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ả.
Tôi nghĩ rằng WMI có thể cung cấp cho bạn thông tin này ...
http://briandesmond.com/blog/getting-total-installed-memory-with-wmi/
Oooh - ước gì tôi đã nghĩ về điều này. +1. –
Tôi không chắc chắn nó là xp thân thiện hay không ... chỉ nghĩ rằng tôi muốn đăng nó như là một ý tưởng :-) – SteelBytes
Đó là. Nên làm việc cho máy XP. –
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
Điều này có cùng sự cố với lệnh gọi 'GlobalMemoryStatusEx'. –
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). –
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. –
- 1. Đặt dung lượng bộ nhớ có sẵn cho AppFabric Caching
- 2. Tìm hiểu số lượng bộ nhớ đang được sử dụng bởi một đối tượng trong C#?
- 3. Làm cách nào để tìm hiểu w/YUM hoặc RPM tệp nào được cài đặt?
- 4. Làm cách nào để tìm hiểu xem .NET 4.02 có được cài đặt không?
- 5. Làm cách nào để tìm ra dung lượng bộ nhớ còn trống trong GNU C++ trên Linux
- 6. Làm cách nào để giảm dung lượng bộ nhớ IOKit khi khởi động quá trình?
- 7. Tìm hiểu Mô hình Bộ nhớ
- 8. Làm cách nào để tìm hiểu thư viện Python được cài đặt trên máy Mac của tôi?
- 9. Làm thế nào tôi có thể tìm ra dung lượng bộ nhớ .Net Appdomain đang sử dụng?
- 10. Nhận dung lượng trống trên bộ nhớ trong
- 11. Dung lượng sử dụng bộ nhớ chia sẻ Azure được tính như thế nào?
- 12. Làm cách nào để tìm hiểu tiện ích Visual Studio nào gây ra rò rỉ bộ nhớ?
- 13. Làm cách nào để tìm kích thước bộ nhớ vật lý trong Java?
- 14. Làm thế nào để cài đặt ant contrib trong Windows?
- 15. java.net.SocketException: Không có dung lượng bộ nhớ đệm (kết nối tối đa đã đạt được?): JVM_Bind
- 16. Cách tìm hiểu phiên bản nào của mod_perl được cài đặt?
- 17. NLTK - làm thế nào để tìm hiểu những gì corpora được cài đặt từ bên trong python?
- 18. Android - Bộ nhớ trong và Bộ nhớ ngoài khi ứng dụng được cài đặt trên thẻ SD
- 19. Làm cách nào để cài đặt jython trên Windows 7?
- 20. Làm thế nào để liệt kê các tệp được cài đặt bởi một Trình cài đặt Windows đã cho?
- 21. Cách sử dụng bộ nhớ trong Windows trong C++
- 22. Làm thế nào để cài đặt calabash trong windows?
- 23. Làm cách nào để tìm hiểu xem dịch vụ Windows có được cài đặt hay không bằng cách sử dụng (tốt nhất) chỉ là lô?
- 24. Có cách nào để đặt lượng bộ nhớ khả dụng trong Trình mô phỏng iPhone không?
- 25. Dung lượng bộ nhớ tối đa cho mỗi quá trình Java trên Windows?
- 26. Rails 3 + Heroku: Tìm hiểu cách sử dụng bộ nhớ của dyno
- 27. Làm cách nào để tìm ra tệp nào chiếm nhiều dung lượng nhất trong git repo?
- 28. Tôi làm cách nào để xác định dung lượng bộ nhớ mà chương trình .NET của tôi đang sử dụng?
- 29. Làm thế nào để cài đặt clojure-contrib trên Windows?
- 30. Làm cách nào để gỡ cài đặt ruby trên đường ray hoàn toàn trên Windows (được cài đặt bằng RailsInstaller)?
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. –