Как использовать GetProcessMemoryInfo в С++?

Я пытаюсь использовать функцию GetProcessMemoryInfo psapi.h внутри приложения С++ на 32-разрядной версии Windows 7.

Я последовал за некоторым уроком, и я сделал что-то вроде:

PPROCESS_MEMORY_COUNTERS pMemCountr;

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

Проблема заключается в том, что я всегда получаю "ложь" от выполнения метода GetProcessMemoryInfo(). Что я здесь делаю неправильно?

Ответ 1

Проблема

sizeof(PPROCESS_MEMORY_COUNTERS)

дает размер PPROCESS_MEMORY_COUNTERS, который является указателем типа PROCESS_MEMORY_COUNTERS* (обратите внимание на double P в начале).

Вы хотите

sizeof(PROCESS_MEMORY_COUNTERS)

Также вам будет намного лучше без new здесь:

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

Ответ 2

измените sizeof (PPROCESS_MEMORY_COUNTERS) на sizeof (PROCESS_MEMORY_COUNTERS)

Ответ 3

В MSDN:

BOOL WINAPI GetProcessMemoryInfo ( В режиме HANDLE Process, Out PPROCESS_MEMORY_COUNTERS ppsmemCounters, В DWORD cb );

Пример:

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

Или Вы можете просмотреть полный код из здесь