Получить размер системы оперативной памяти

#c #windows #windows-7 #ram

#c #Windows #windows-7 #ОЗУ

Вопрос:

Я хотел бы знать, как я могу получить размер моей оперативной памяти с помощью C (в Windows 7).

Ответ №1:

Ладно, ребята! Я нашел решение, выполнив это следующим образом [режим guru включен]:

 #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 (amp;statex);
   cout << "Physical RAM => " << (float)statex.ullTotalPhys/(1024*1024*1024)<< endl;

   system("PAUSE");
   return EXIT_SUCCESS;
}
  

Мне пришлось определить _WIN32_WINNT 0x0501, но я не знаю, почему [режим guru выключен].

Если бы кто-нибудь мог объяснить мне, что он делает и почему он не работает без него.

Еще одна вещь, что это:

 statex.dwLength = sizeof (statex);
  

Комментарии:

1. Для получения дополнительной информации о _WIN32_WINNT ознакомьтесь с исходным кодом разработчика Microsoft: learn.microsoft.com/en-us/cpp/porting /…

Ответ №2:

Используется GetPhysicallyInstalledSystemMemory для получения объема оперативной памяти, который физически установлен на компьютере.

(Обратите внимание, что для этого требуется Windows Vista с пакетом обновления 1 или более поздней версии. Функция недоступна в более ранних версиях операционной системы Windows.)

В замечаниях к MSDN говорится:

Функция GetPhysicallyInstalledSystemMemory извлекает объем физически установленной оперативной памяти из таблиц встроенного программного обеспечения SMBIOS компьютера. Это может отличаться от объема, сообщаемого функцией GlobalMemoryStatusEx, которая устанавливает член ULTOTALPHYS структуры MEMORYSTATUSEX в размер физической памяти, доступный для использования операционной системой. Объем памяти, доступный операционной системе, может быть меньше объема памяти, физически установленной в компьютере, поскольку BIOS и некоторые драйверы могут резервировать память в качестве областей ввода-вывода для устройств с отображением памяти, делая память недоступной для операционной системы и приложений.

Объем физической памяти, извлекаемый функцией GetPhysicallyInstalledSystemMemory, должен быть равен или больше объема, сообщаемого функцией GlobalMemoryStatusEx; если он меньше, данные SMBIOS искажены и функция завершается с ошибкой ERROR_INVALID_DATA. Искаженные данные SMBIOS могут указывать на проблему с компьютером пользователя.

Это означает, что вы также хотели бы взглянуть на GlobalMemoryStatusEx .

Ответ №3:

В Windows:

 typedef BOOL (WINAPI *PGMSE)(LPMEMORYSTATUSEX);
PGMSE pGMSE = (PGMSE) GetProcAddress( GetModuleHandle( TEXT( "kernel32.dll" ) ), TEXT( "GlobalMemoryStatusEx") );
if ( pGMSE != 0 )
{
    MEMORYSTATUSEX mi;
    memset( amp;mi, 0, sizeof(MEMORYSTATUSEX) );
    mi.dwLength = sizeof(MEMORYSTATUSEX);
    if ( pGMSE( amp;mi ) == TRUE )
        os << "RAM: " << mi.ullTotalPhys / 1048576 << "MB";
    else
        pGMSE = 0;
}
if ( pGMSE == 0 )
{
    MEMORYSTATUS mi;
    memset( amp;mi, 0, sizeof(MEMORYSTATUS) );
    mi.dwLength = sizeof(MEMORYSTATUS);
    GlobalMemoryStatus( amp;mi );
    os << "RAM: " << mi.dwTotalPhys / 1048576 << "MB";
}
  

В Linux:

Читать /proc/meminfo .

Ответ №4:

Вы хотите использовать GlobalMemoryStatusEx, который возвращает MEMORYSTATUSEX. Требуемое поле называется ULTOTALPHYS.

Ответ №5:

0x501 Это версия WindowsXP, то есть MEMORYSTATUSEX структура не поддерживается некоторыми старыми версиями Windows. Ваш windef.h, вероятно, указывает на меньшее значение, WINVER чем 0x5XX .