2011-02-02 39 views
0

我需要獲取正在運行的程序的最新內存使用情況。我GOOGLE了一下,發現GetProcessMemoryInfo這看起來像我需要的,但我不能得到它的工作。 它不會把我找到的窗口處理,我不知道他們想要什麼。需要獲取程序當前內存的幫助

#include <iostream> 
#include <Windows.h> 
#include <tchar.h> 
#include <Psapi.h> 

using namespace std; 


int main() 
{ 

HANDLE hwnd = FindWindow(NULL,TEXT("Calculator")); 


PPROCESS_MEMORY_COUNTERS ppsmemCounters; 

DWORD cb; 

BOOL WINAPI GetProcessMemoryInfo(hwnd, ppsmemCounters, cb); 

return 0; 
} 

我只是試圖找到窗口的計算器現在。 我得到的錯誤之一是錯誤:類型「HANDLE」的值不能用於初始化實體類型「BOOL」。 另一個是「錯誤C2078:太多初始值設定項」。 我使用VC++ 2010,我的操作系統是Windows 7

回答

2

GetProcessMemoryInfo需要過程手柄,而不是一個窗口句柄。找到該窗口後,您可以撥打GetWindowThreadProcesId來獲取進程ID,然後撥打OpenProcess來獲取進程的句柄。那麼你終於可以撥打GetProcessMemoryInfo那個句柄。

當你打電話給它時,你在開始時不需要BOOL WINAPI。通常你要分配的返回值,以便您可以檢查它是否成功,是這樣的:

bool succeded = GetProcessMemoryInfo(process, /* ... */); 

編輯:這裏是一個非常簡單的演示:

#include <windows.h> 
#include <psapi.h> 
#include <iostream> 

int main(int argc, char **argv) { 
    HWND window = FindWindow(NULL, argv[1]); 
    DWORD id; 
    GetWindowThreadProcessId(window, &id); 

    HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, id); 

    PROCESS_MEMORY_COUNTERS info = {0}; 
    info.cb = sizeof(info); 
    GetProcessMemoryInfo(process, &info, sizeof(info)); 

    std::cout << info.WorkingSetSize; 
    return 0; 
} 
+0

另一個問題要注意的 - 不聲明一個類型爲「PPROCESS_MEMORY_COUNTERS」的對象。相反,創建一個類型爲「PROCESS_MEMORY_COUNTERS」的對象,然後在填寫相應的字段之後將指針傳遞給「GetProcessMemoryInfo」。否則,該功能不會給你任何關於該過程的有意義的信息。 – templatetypedef 2011-02-02 05:06:09