我想知道如何通过C ++(在Windows 7上)获取RAM的大小。
答案 0 :(得分:7)
使用GetPhysicallyInstalledSystemMemory
检索计算机上物理安装的RAM量。
(请注意,这需要Windows Vista SP1或更高版本。该功能在早期版本的Windows操作系统上不可用。)
MSDN上的remarks说:
GetPhysicallyInstalledSystemMemory 函数检索的数量 从物理上安装RAM 计算机的SMBIOS固件表。 这可能与金额有所不同 由GlobalMemoryStatusEx报告 function,设置ullTotalPhys MEMORYSTATUSEX结构的成员 到那个物理内存量 适用于操作系统 使用。可用的内存量 到操作系统可以少 比物理上的记忆量 因为安装在电脑上 BIOS和一些驱动程序可能会保留 内存作为I / O区域 内存映射设备,使 内存不可用于操作 系统和应用程序。
物理内存量 由...检索 GetPhysicallyInstalledSystemMemory 功能必须等于或大于 比报告的数量 GlobalMemoryStatusEx函数; 如果它 更少,SMBIOS数据格式不正确 并且函数失败了 ERROR_INVALID_DATA。格式错误的SMBIOS 数据可能表明存在问题 用户的电脑。
这意味着,您还需要查看GlobalMemoryStatusEx
。
答案 1 :(得分:5)
在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
。
答案 2 :(得分:5)
好的,伙计们!我已经找到了这样的解决方案[guru mode on]:
#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,但我不知道为什么[guru mode off]。
如果有人能够解释我在做什么,为什么没有它就行不通。
还有一件事,那是什么:
statex.dwLength = sizeof (statex);
答案 3 :(得分:4)
您想使用返回GlobalMemoryStatusEx的MEMORYSTATUSEX。您想要的字段称为ullTotalPhys。
答案 4 :(得分:0)
0x501
是WindowsXP版本,即某些较旧的Windows版本不支持MEMORYSTATUSEX
结构。您的windef.h可能指向WINVER
低于0x5XX
。