подскажите, кто в курсе....
использую CreateToolhelp32Snapshot для получения имени экзе файла процесса, пример взят из инета, вроде все работает - имя возвращается.
но при каждом вызове этого кода похоже происходит утечка памяти, т.е. свободная память уменьшается на 1-3 мб.
это ошибка в коде или "нормальная" работа? и есть ли какой еще способ получить в итоге хендл окна по пид процесса?
исходный код:
try
FSnapshotHandle := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Result := '';
while (Integer (ContinueLoop) <> 0) and (Result='') do
begin
if ((FProcessEntry32.th32ProcessID = ProcID) and (FProcessEntry32.th32ParentProcessID=0))
then
begin
Result := FProcessEntry32.szExeFile;
break;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
finally
Windows.CloseHandle(FSnapshotHandle);
end;
wince + CreateToolhelp32Snapshot
Модератор: Модераторы
Код: Выделить всё
#include <windows.h>
#include <tlhelp32.h>
VOID PrintModuleList(HANDLE CONST hStdOut, DWORD CONST dwProcessId) {
MODULEENTRY32 meModuleEntry;
TCHAR szBuff[1024];
DWORD dwTemp;
HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
TH32CS_SNAPMODULE, dwProcessId);
if(INVALID_HANDLE_VALUE == hSnapshot) {
return;
}
meModuleEntry.dwSize = sizeof(MODULEENTRY32);
Module32First(hSnapshot, &meModuleEntry);
do {
wsprintf(szBuff, L" ba: %08X, bs: %08X, %srn",
meModuleEntry.modBaseAddr, meModuleEntry.modBaseSize,
meModuleEntry.szModule);
WriteConsole(hStdOut, szBuff, lstrlen(szBuff), &dwTemp, NULL);
} while(Module32Next(hSnapshot, &meModuleEntry));
CloseHandle(hSnapshot);
}сам не юзал, но судя по куску кода забыли - meModuleEntry.dwSize = sizeof(MODULEENTRY32);
а там мусор какой, может изза этого
Добавлено спустя 2 минуты 5 секунд:
тобишь в вашем случае
FProcessEntry32.dwSize = sizeof(FProcessEntry32);
Добавлено спустя 2 минуты 22 секунды:
Код: Выделить всё
VOID PrintProcessList(HANDLE CONST hStdOut) {
PROCESSENTRY32 peProcessEntry;
TCHAR szBuff[1024];
DWORD dwTemp;
HANDLE CONST hSnapshot = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0);
if(INVALID_HANDLE_VALUE == hSnapshot) {
return;
}
peProcessEntry.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnapshot, &peProcessEntry);
do {
wsprintf(szBuff, L"=== %08X %s ===\r\n",
peProcessEntry.th32ProcessID, peProcessEntry.szExeFile);
WriteConsole(hStdOut, szBuff, lstrlen(szBuff), &dwTemp, NULL);
PrintModuleList(hStdOut, peProcessEntry.th32ProcessID);
} while(Process32Next(hSnapshot, &peProcessEntry));
CloseHandle(hSnapshot);
}FProcessEntry32.dwSize = sizeof(FProcessEntry32);
это сделано немного выше, просто уже перепробовал кучу вариантов....
Добавлено спустя 1 час 39 минут 56 секунд:
однако ларчик просто открывался...
закрывать в данном случае хендл нужно с помощью CloseToolhelp32Snapshot
это сделано немного выше, просто уже перепробовал кучу вариантов....
Добавлено спустя 1 час 39 минут 56 секунд:
однако ларчик просто открывался...
закрывать в данном случае хендл нужно с помощью CloseToolhelp32Snapshot
