wince + CreateToolhelp32Snapshot

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

wince + CreateToolhelp32Snapshot

Сообщение dimds » 04.08.2015 11:51:43

подскажите, кто в курсе....
использую 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;
dimds
незнакомец
 
Сообщения: 8
Зарегистрирован: 07.05.2015 09:41:33

Re: wince + CreateToolhelp32Snapshot

Сообщение sts » 04.08.2015 12:33:43

Код: Выделить всё
#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);
}
sts
постоялец
 
Сообщения: 455
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: wince + CreateToolhelp32Snapshot

Сообщение dimds » 04.08.2015 12:54:08

FProcessEntry32.dwSize = sizeof(FProcessEntry32);
это сделано немного выше, просто уже перепробовал кучу вариантов....

Добавлено спустя 1 час 39 минут 56 секунд:
однако ларчик просто открывался...
закрывать в данном случае хендл нужно с помощью CloseToolhelp32Snapshot
dimds
незнакомец
 
Сообщения: 8
Зарегистрирован: 07.05.2015 09:41:33


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 232

Рейтинг@Mail.ru