2011-02-02 3 views
0

Мне нужно получить актуальное использование памяти программы, которая работает. я разобрал его и нашел 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; 
} 

Я просто пытаюсь найти калькулятор окна на данный момент. Одна из ошибок, которые я получаю: Ошибка: значение типа «РУЧКА» не может использоваться для инициализации типа объекта «BOOL». Другой «ошибка C2078: слишком много инициализаторов». Я использую VC++ 2010, и моя ОС Windows, 7.

ответ

2

GetProcessMemoryInfo занимает процесс ручку, а не окно ручки. После того, как вы найдете окно, вы можете позвонить GetWindowThreadProcesId в идентификатор процесса, затем OpenProcess, чтобы получить дескриптор процесса. Затем вы можете, наконец, вызвать GetProcessMemoryInfo для этого дескриптора.

Когда вы это называете, вам не нужно BOOL WINAPI в начале. Как правило, вы хотите присвоить возвращаемое значение, так что вы можете проверить, удалось ли это, что-то вроде:

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

Edit: здесь действительно упрощенным демо:

#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, также я знаю, что это может звучать dum, но где я могу поместить имя окна? – bob

Смежные вопросы