#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
.