获取RAM系统大小

时间:2011-04-05 14:37:51

标签: c++ windows windows-7 ram

我想知道如何通过C ++(在Windows 7上)获取RAM的大小。

5 个答案:

答案 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)

您想使用返回GlobalMemoryStatusExMEMORYSTATUSEX。您想要的字段称为ullTotalPhys。

答案 4 :(得分:0)

0x501是WindowsXP版本,即某些较旧的Windows版本不支持MEMORYSTATUSEX结构。您的windef.h可能指向WINVER低于0x5XX