2011-04-05 2 views

ответ

3

В 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:

Read /proc/meminfo.

7

Использовать GetPhysicallyInstalledSystemMemory для извлечения ОЗУ физически установлено на компьютере.

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

remarks на MSDN говорят:

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

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

Это означает, что вы также хотели бы посмотреть на GlobalMemoryStatusEx.

5

Хорошо, ребята! Я нашел решение, делая это как то [Режим гуру по]:

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

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

Смежные вопросы