2011-12-27 18 views
10

Sto cercando di utilizzare la funzione GetProcessMemoryInfo di psapi.h all'interno di un'applicazione C++ su Windows 7 a 32 bit.Come utilizzare GetProcessMemoryInfo in C++?

ho seguito un po 'di tutorial e ho fatto qualcosa di simile:

PPROCESS_MEMORY_COUNTERS pMemCountr; 

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

Il problema è che ottengo sempre "false" dall'esecuzione del metodo GetProcessMemoryInfo(). Cosa sto facendo di sbagliato qui?

+0

Prova a chiamare 'GetLastError' dopo che, per avere maggiori informazioni sulla causa dell'errore – alf

+0

cosa fa GetLastError) Retuns (? – marcinj

+2

Una domanda relativamente semplice con una risposta semplice, ma ancora ben fatta. Meglio di molto di quello che vedo qui, quindi un +1 da me. –

risposta

19

Il problema è

sizeof(PPROCESS_MEMORY_COUNTERS) 

cede la dimensione di PPROCESS_MEMORY_COUNTERS che è un tipo di puntatore PROCESS_MEMORY_COUNTERS* (nota doppio P all'inizio).

Quello che vuoi è

sizeof(PROCESS_MEMORY_COUNTERS) 

Inoltre sarete molto meglio senza new qui:

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

Davvero perfetto! – Aslan986

+1

Una buona ragione per cui dovresti sempre usare il nome della variabile come argomento per l'operatore 'sizeof', piuttosto che il nome del tipo. –

+1

@CodyGray: non è vero. Hai solo bisogno di capire cosa hai messo nel tuo operatore 'sizeof'. Mettere l'indirizzo del puntatore o il tipo 'PPROCESS_MEMORY_COUNTERS' restituirà la dimensione del puntatore, che è 4 byte su un sistema x86. Mettere l'oggetto puntato su questo indirizzo o sul tipo 'PROCESS_MEMORY_COUNTERS' restituirà la dimensione dell'oggetto reale. Né è * sempre * la buona soluzione. –

4

cambiamento sizeof (PPROCESS_MEMORY_COUNTERS) per sizeof (PROCESS_MEMORY_COUNTERS)

2

su MSDN :

BOOL WINAPI GetProcessMemoryInfo ( In Process MANICO, Out PPROCESS_MEMORY_COUNTERS ppsmemCounters, In DWORD cb );

Esempio:

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

oppure potete piena codice here