2011-02-02 9 views
0

実行中のプログラムの最新のメモリ使用を取得する必要があります。私はそれをgoogledと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; 
} 

私は現在、ウィンドウの電卓を探しています。 エラーの1つは「エラー」です。エンティティタイプ「BOOL」を初期化するために、タイプ「HANDLE」の値を使用することはできません。 もう1つは「エラーC2078:初期化子が多すぎます」です。 私はVC++ 2010を使用していますし、私のOSが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

+0

GetWindowThreadProcesIdを試してエラーが発生しました。 "HANDLE"型の値を使用して、エンティティタイプ "DWORD"を初期化することはできません。ちょっと混乱しているということを私に見せてもらえますか? – bob

+0

Tyvmはコードですが、リンクエラーが発生します:main.obj:エラーLNK2019:未解決の外部シンボル_GetProcessMemoryInfo @ 12が関数_mainで参照されています。また、これはダムと聞こえるかもしれませんが、どこにウィンドウ名を入れますか? – bob

関連する問題