2011-12-27 15 views
10

Próbuję użyć funkcji GetProcessMemoryInfo z psapi.h wewnątrz aplikacji C++ w systemie Windows 7 w wersji 32-bitowej.Jak korzystać z GetProcessMemoryInfo w C++?

I następnie jakiś poradnik i zrobiłem coś takiego:

PPROCESS_MEMORY_COUNTERS pMemCountr; 

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

Problemem jest to, że zawsze uzyskać „false” z realizacji metody GetProcessMemoryInfo(). Co ja tu robię źle?

+0

Spróbuj zadzwonić 'GetLastError' Po tym, aby uzyskać więcej informacji na temat przyczyny błędu – alf

+0

co robi GetLastError() retuns? – marcinj

+2

Względnie proste pytanie z prostą odpowiedzią, ale nadal dobrze zadawane. Lepsze niż wiele z tego, co widzę tutaj, więc +1 ode mnie. –

Odpowiedz

19

Problemem jest

sizeof(PPROCESS_MEMORY_COUNTERS) 

daje wielkość PPROCESS_MEMORY_COUNTERS który jest PROCESS_MEMORY_COUNTERS* typ wskaźnika (zauważ podwójne P na początku).

Co chcesz jest

sizeof(PROCESS_MEMORY_COUNTERS) 

też będziesz o wiele lepiej bez new tutaj:

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

Naprawdę idealne! – Aslan986

+1

Dobry powód, dla którego należy zawsze używać nazwy zmiennej jako argumentu operatora 'sizeof', a nie nazwy typu. –

+1

@CodyGray: to nie jest prawda. Po prostu musisz zrozumieć, co dodajesz do swojego operatora 'sizeof'. Umieszczenie adresu wskaźnika lub typu "PPROCESS_MEMORY_COUNTERS" spowoduje zwrócenie rozmiaru wskaźnika, który wynosi 4 bajty w systemie x86. Umieszczenie obiektu wskazanego pod tym adresem lub typu "PROCESS_MEMORY_COUNTERS" zwróci rzeczywisty rozmiar obiektu. Ani też * zawsze * dobre rozwiązanie. –

4

zmian sizeof (PPROCESS_MEMORY_COUNTERS) sizeof (PROCESS_MEMORY_COUNTERS)

2

na MSDN :

BOOL WINAPI GetProcessMemoryInfo ( W obsłudze procesu, odchodzący PPROCESS_MEMORY_COUNTERS ppsmemCounters, W DWORD cb );

Przykład:

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

można też zobaczyć pełny kod z here

Powiązane problemy