2011-04-05 16 views

Respuesta

3

En 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"; 
} 

En Linux:

Leer /proc/meminfo.

7

Utilice GetPhysicallyInstalledSystemMemory para recuperar la cantidad de RAM que es físicamente instalada en la computadora.

(.. Tenga en cuenta que esto requiere Windows Vista SP1 o posterior La función no está disponible en las versiones anteriores del sistema operativo Windows)

El remarks en MSDN dicen:

La función GetPhysicallyInstalledSystemMemory recupera la cantidad de RAM físicamente instalada de las tablas de firmware SMBIOS de la computadora . esto puede diferir de la cantidad informado por la función GlobalMemoryStatusEx , que establece el ullTotalPhys miembro de la estructura MEMORYSTATUSEX a la cantidad de memoria física que está disponible para el sistema operativo utilizar. La cantidad de memoria disponible para el sistema operativo puede ser menor que la cantidad de memoria física instalado en el equipo porque el BIOS y algunos conductores pueden reservar memoria como I regiones de E/S para dispositivos asignados a la memoria, haciendo que la memoria no disponible para el sistema operativo y aplicaciones.

La cantidad de memoria física recuperado por la función GetPhysicallyInstalledSystemMemory debe ser igual o mayor que la cantidad informado por la función GlobalMemoryStatusEx; si es es menor, los datos de SMBIOS están mal formados y la función falla con ERROR_INVALID_DATA. Los datos mal formados de SMBIOS pueden indicar un problema con la computadora del usuario .

Eso significa que también debería consultar GlobalMemoryStatusEx.

5

Bien, muchachos! He encontrado la solución al hacer esto al igual que [Modo de gurú en]:

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

tuviera que definir 0x0501 _WIN32_WINNT, pero yo no sé por qué [Modo gurú está apagado].

Si alguien pudiera explicarme qué está haciendo y por qué no funciona sin él.

Una cosa más, lo que es:

statex.dwLength = sizeof (statex); 
0

El 0x501 es la versión de Windows XP, es decir, la estructura MEMORYSTATUSEX no es compatible con algunas versiones anteriores de Windows. Su windef.h probablemente apunte a un WINVER inferior a 0x5XX.

Cuestiones relacionadas