我想知道如何通过 C++(在 Windows 7 上)获取我的 RAM 大小。
5 回答
用于检索实际安装在计算机上GetPhysicallyInstalledSystemMemory
的 RAM 量。
(请注意,这需要 Windows Vista SP1 或更高版本。该功能在早期版本的 Windows 操作系统上不可用。)
MSDN上的评论说:
GetPhysicallyInstalledSystemMemory 函数从计算机的 SMBIOS 固件表中检索物理安装的 RAM 量。 这可能与 GlobalMemoryStatusEx 函数报告的数量不同,后者将 MEMORYSTATUSEX 结构的 ullTotalPhys 成员设置为可供操作系统使用的物理内存量。操作系统可用的内存量可能小于计算机中物理安装的内存量,因为 BIOS 和某些驱动程序可能会将内存保留为内存映射设备的 I/O 区域,从而使内存对操作系统不可用和应用。
GetPhysicallyInstalledSystemMemory 函数检索的物理内存量必须等于或大于 GlobalMemoryStatusEx 函数报告的量;如果小于,则 SMBIOS 数据格式错误并且函数失败并显示 ERROR_INVALID_DATA。格式错误的 SMBIOS 数据可能表明用户的计算机存在问题。
这意味着,您还想查看GlobalMemoryStatusEx
.
好的,伙计们!我通过这样做[大师模式]找到了解决方案:
#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;
}
我必须定义_WIN32_WINNT 0x0501,但我不知道为什么[大师模式关闭]。
如果有人可以向我解释它在做什么以及为什么没有它就无法工作。
还有一件事,那是什么:
statex.dwLength = sizeof (statex);
在 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";
}
在 Linux 上:
阅读/proc/meminfo
。
您想使用返回MEMORYSTATUSEX的GlobalMemoryStatusEx。您想要的字段称为 ullTotalPhys。
这0x501
是WindowsXP 版本,即MEMORYSTATUSEX
某些旧Windows 版本不支持该结构。您的 windef.h 可能指向WINVER
低于0x5XX
.