2011-12-27 42 views
10

Tôi đang cố gắng sử dụng chức năng GetProcessMemoryInfo của psapi.h bên trong ứng dụng C++ trên Windows 7 32 bit.Làm thế nào để sử dụng GetProcessMemoryInfo trong C++?

Tôi đi theo một số hướng dẫn và tôi đã làm một cái gì đó như:

PPROCESS_MEMORY_COUNTERS pMemCountr; 

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

Vấn đề là tôi luôn lấy "false" từ việc thực hiện các phương pháp GetProcessMemoryInfo(). Tôi làm gì sai ở đây?

+0

Thử gọi 'GetLastError' sau đó, để có được thêm thông tin về nguyên nhân của lỗi – alf

+0

những gì hiện GetLastError) retuns (? – marcinj

+2

Câu hỏi tương đối đơn giản với câu trả lời đơn giản nhưng vẫn được hỏi rõ. Tốt hơn rất nhiều những gì tôi thấy ở đây, vì vậy một +1 từ tôi. –

Trả lời

19

Vấn đề là

sizeof(PPROCESS_MEMORY_COUNTERS) 

mang lại kích thước của PPROCESS_MEMORY_COUNTERS mà là một loại con trỏ PROCESS_MEMORY_COUNTERS* (lưu ý đôi P trong đầu).

gì bạn muốn là

sizeof(PROCESS_MEMORY_COUNTERS) 

Ngoài ra bạn sẽ được tốt hơn off mà không new đây:

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

Thực sự hoàn hảo! – Aslan986

+1

Lý do chính đáng tại sao bạn nên luôn sử dụng tên của biến làm đối số cho toán tử 'sizeof', thay vì tên kiểu. –

+1

@CodyGray: điều đó không đúng. Bạn chỉ cần hiểu những gì bạn đưa vào toán tử 'sizeof' của bạn. Đặt địa chỉ con trỏ hoặc loại 'PPROCESS_MEMORY_COUNTERS' sẽ trả về kích thước con trỏ, là 4 byte trên hệ thống x86. Đặt đối tượng được trỏ vào địa chỉ này hoặc loại 'PROCESS_MEMORY_COUNTERS' sẽ trả về kích thước đối tượng thực tế. Không phải luôn luôn là giải pháp tốt. –

4

thay đổi sizeof (PPROCESS_MEMORY_COUNTERS) để sizeof (PROCESS_MEMORY_COUNTERS)

2

On MSDN :

BOOL WINAPI GetProcessMemoryInfo ( Trong Process HANDLE, Out PPROCESS_MEMORY_COUNTERS ppsmemCounters, Trong DWORD cb );

Ví dụ:

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

Hoặc Bạn có thể xem mã đầy đủ từ here

Các vấn đề liên quan