2011-12-27 16 views
10

Estoy tratando de usar la función GetProcessMemoryInfo de psapi.h dentro de una aplicación C++ en Windows 7 de 32 bits.¿Cómo se usa GetProcessMemoryInfo en C++?

que siguieron algunos tutorial y lo hice algo como:

PPROCESS_MEMORY_COUNTERS pMemCountr; 

pMemCountr = new PROCESS_MEMORY_COUNTERS(); 
bool result = GetProcessMemoryInfo(GetCurrentProcess(), 
            pMemCountr, 
            sizeof(PPROCESS_MEMORY_COUNTERS)); 

El problema es que siempre obtengo "falsa" de la ejecución del método GetProcessMemoryInfo(). ¿Qué estoy haciendo mal aquí?

+0

Trate de llamar 'GetLastError' después de eso, para obtener más información sobre la causa del error – alf

+0

lo hace getlasterror Retuns()? – marcinj

+2

Una pregunta relativamente simple con una respuesta simple, pero todavía bien hecha. Mejor que mucho de lo que veo por aquí, así que un +1 de mí. –

Respuesta

19

El problema es

sizeof(PPROCESS_MEMORY_COUNTERS) 

produce el tamaño de PPROCESS_MEMORY_COUNTERS que es un puntero tipo PROCESS_MEMORY_COUNTERS* (nota doble P en el principio).

Lo que queremos es

sizeof(PROCESS_MEMORY_COUNTERS) 

también será mucho mejor sin new aquí:

PROCESS_MEMORY_COUNTERS memCounter; 
BOOL result = GetProcessMemoryInfo(GetCurrentProcess(), 
            &memCounter, 
            sizeof(memCounter)); 
+0

¡Realmente perfecto! – Aslan986

+1

Una buena razón por la que siempre debe usar el nombre de la variable como argumento para el operador 'sizeof', en lugar del nombre del tipo. –

+1

@CodyGray: eso no es cierto. Solo necesitas entender lo que pones en tu operador 'sizeof'. Poner la dirección del puntero o el tipo 'PPROCESS_MEMORY_COUNTERS' devolverá el tamaño del puntero, que es de 4 bytes en un sistema x86. Poner el objeto apuntando a esta dirección o el tipo 'PROCESS_MEMORY_COUNTERS' devolverá el tamaño real del objeto. Tampoco * siempre * es la buena solución. –

4

cambio sizeof (PPROCESS_MEMORY_COUNTERS) a sizeof (PROCESS_MEMORY_COUNTERS)

2

en MSDN :

BOOL WINAPI GetProcessMemoryInfo ()En Proceso HANDLE, Out PPROCESS_MEMORY_COUNTERS ppsmemCounters, En cb DWORD );

Ejemplo:

HANDLE hProcess; 
PROCESS_MEMORY_COUNTERS pmc; 

printf("\nProcess ID: %u\n", processID); 

// Print information about the memory usage of the process. 
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID); 
if (NULL == hProcess) 
    return; 

if (GetProcessMemoryInfo((hProcess, &pmc, sizeof(pmc))) 
{ 
    printf("\tWorkingSetSize: 0x%08X - %u\n", pmc.WorkingSetSize, 
               pmc.WorkingSetSize/1024);   
    printf("\tQuotaPeakPagedPoolUsage: 0x%08X - %u\n", 
     pmc.QuotaPeakPagedPoolUsage , pmc.QuotaPeakPagedPoolUsage/1024); 
    printf("\tQuotaPagedPoolUsage: 0x%08X - %u\n", pmc.QuotaPagedPoolUsage, 
               pmc.QuotaPagedPoolUsage/1024); 
    printf("\tQuotaPeakNonPagedPoolUsage: 0x%08X - %u\n", 
       pmc.QuotaPeakNonPagedPoolUsage,pmc.QuotaPeakNonPagedPoolUsage/1024); 
    printf("\tQuotaNonPagedPoolUsage:0x%08X-%u\n",pmc.QuotaNonPagedPoolUsage , pmc.QuotaNonPagedPoolUsage/1024); 
    printf("\tPagefileUsage: 0x%08X - %u\n", pmc.PagefileUsage,  pmc.PagefileUsage/1024); 
    printf("\tPeakPagefileUsage: 0x%08X - %u\n", pmc.PeakPagefileUsage, pmc.PeakPagefileUsage/1024); 
    printf("\tcb: 0x%08X - %u\n", pmc.cb , pmc.cb/1024);  
} 
CloseHandle(hProcess); 

o se puede ver el código completo de here