【问题标题】:Get RAM system size获取 RAM 系统大小
【发布时间】:2011-04-05 14:37:51
【问题描述】:

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

【问题讨论】:

    标签: c++ windows windows-7 ram


    【解决方案1】:

    好的,伙计们!我通过这样做[大师模式]找到了解决方案:

    #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);
    

    【讨论】:

    【解决方案2】:

    使用 GetPhysicallyInstalledSystemMemory 检索计算机上实际安装的 RAM 容量。

    (请注意,这需要 Windows Vista SP1 或更高版本。该功能在早期版本的 Windows 操作系统上不可用。)

    MSDN 上的remarks 说:

    GetPhysicallyInstalledSystemMemory 函数检索数量 从物理安装的 RAM 计算机的 SMBIOS 固件表。 这可能与金额不同 由 GlobalMemoryStatusEx 报告 函数,它设置 ullTotalPhys MEMORYSTATUSEX 结构的成员 到物理内存的数量 可用于操作系统 使用。可用内存量 到操作系统可以少 比物理上的内存量 安装在计算机中,因为 BIOS 和某些驱动程序可能会保留 内存作为 I/O 区域 内存映射设备,使 内存不可用的操作 系统和应用程序。

    物理内存量 由 获取物理安装的系统内存 函数必须等于或大于 超过报告的金额 GlobalMemoryStatusEx 函数; 如果是 少,SMBIOS 数据格式错误 并且该功能失败 ERROR_INVALID_DATA。格式错误的 SMBIOS 数据可能表明存在问题 用户的计算机。

    也就是说,您还想查看GlobalMemoryStatusEx

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在 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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-16
            • 2017-04-26
            • 2011-05-19
            • 1970-01-01
            • 2011-11-14
            • 2015-03-29
            相关资源
            最近更新 更多