Tôi muốn biết làm thế nào tôi có thể nhận được kích thước của RAM của tôi thông qua C + + (trên Windows 7).Lấy kích thước hệ thống RAM
Trả lời
Bạn muốn sử dụng số GlobalMemoryStatusEx trả về MEMORYSTATUSEX. Trường bạn muốn được gọi là ullTotalPhys.
Trên Windows:
typedef BOOL (WINAPI *PGMSE)(LPMEMORYSTATUSEX);
PGMSE pGMSE = (PGMSE) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), TEXT("GlobalMemoryStatusEx"));
if (pGMSE != 0)
{
MEMORYSTATUSEX mi;
memset(&mi, 0, sizeof(MEMORYSTATUSEX));
mi.dwLength = sizeof(MEMORYSTATUSEX);
if (pGMSE(&mi) == TRUE)
os << "RAM: " << mi.ullTotalPhys/1048576 << "MB";
else
pGMSE = 0;
}
if (pGMSE == 0)
{
MEMORYSTATUS mi;
memset(&mi, 0, sizeof(MEMORYSTATUS));
mi.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&mi);
os << "RAM: " << mi.dwTotalPhys/1048576 << "MB";
}
Trên Linux:
đọc /proc/meminfo
.
Sử dụng GetPhysicallyInstalledSystemMemory
để truy xuất số lượng RAM được cài đặt vật lý trên máy tính.
(.. Lưu ý rằng điều này đòi hỏi Windows Vista SP1 hoặc mới hơn Các chức năng không có sẵn trên các phiên bản trước của hệ điều hành Windows)
Các remarks trên MSDN nói:
Các GetPhysicallyInstalledSystemMemory chức năng truy xuất số lượng RAM được cài đặt vật lý từ các bảng phần mềm SMBIOS của máy tính của máy tính. này có thể khác với số tiền báo cáo của GlobalMemoryStatusEx chức năng, thiết lập ullTotalPhys thành viên của cấu trúc MEMORYSTATUSEX để dung lượng bộ nhớ vật lý mà hiện có sẵn cho hệ điều hành sử dụng. Dung lượng bộ nhớ có sẵn cho hệ điều hành có thể ít hơn so với số lượng bộ nhớ được cài đặt trong máy tính vì BIOS và một số trình điều khiển có thể đặt trước bộ nhớ làm vùng I/O cho bộ nhớ không khả dụng với hệ điều hành và ứng dụng .
Lượng bộ nhớ vật lý lấy ra bởi GetPhysicallyInstalledSystemMemory chức năng phải bằng hoặc lớn hơn số tiền báo cáo của các chức năng GlobalMemoryStatusEx; nếu nó ít hơn, dữ liệu SMBIOS không đúng và chức năng không thành công với ERROR_INVALID_DATA. Dữ liệu SMBIOS không đúng định dạng có thể cho biết sự cố với máy tính của người dùng .
Điều đó có nghĩa là bạn cũng muốn xem GlobalMemoryStatusEx
.
Được rồi, các bạn! Tôi đã tìm thấy các giải pháp bằng cách làm này như thế [chế độ guru trên]:
#define _WIN32_WINNT 0x0501 // I misunderstand that
#include <windows.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
MEMORYSTATUSEX statex;
statex.dwLength = sizeof (statex); // I misunderstand that
GlobalMemoryStatusEx (&statex);
cout << "Physical RAM => " << (float)statex.ullTotalPhys/(1024*1024*1024)<< endl;
system("PAUSE");
return EXIT_SUCCESS;
}
tôi phải xác định _WIN32_WINNT 0x0501, nhưng tôi không biết tại sao [chế độ guru tắt].
Nếu ai đó có thể giải thích cho tôi biết nó đang làm gì và tại sao nó không hoạt động mà không có nó.
một điều nữa, là những gì mà:
statex.dwLength = sizeof (statex);
Các 0x501
là phiên bản WindowsXP, ví dụ: các MEMORYSTATUSEX
struct không được hỗ trợ bởi một số phiên bản Windows cũ hơn. Windef.h của bạn có thể trỏ đến mức thấp hơn WINVER
hơn 0x5XX
.
Tại sao bạn muốn biết điều đó? –