Назад |
Скачай демонстрационный проект (26,1 кб)
Самый старый и надежный способ. Он появился еще в Windows 95 и не поддерживается в Windows NT. Использует функции Process32First и Process32Next. Но прежде надо создать «моментальный снимок» системы с помощью CreateToolhelp32Snapshot. Этот снимок представляет собой readonly-копию одного или более списков системных объектов: процессов, потоков, модулей и куч.
Все Tool Help функции содержатся в kernel32.dll. Для их использования необходимо включить в uses модуль tlhelp32.
Чтобы получить список процессов надо вызвать функцию CreateToolhelp32Snapshot с флагом TH32CS_SNAPPROCESS (или TH32CS_SNAPALL, чтобы получить списки сразу всех объектов). Во второй параметр надо передавать идентификатор процесса, о котором мы собираем информацию. В данном случае этот параметр игнорируется и мы передаем в него ноль (вообще 0 – обозначает текущий процесс). CreateToolhelp32Snapshot возвращает хэндл снапшота (нашего «моментального снимка»).
По списку процессов можно «пробежаться» с помощью функций Process32First и Process32Next. В первом параметре они получают хэндл снапшота, а во втором возвращают указатель на структуру TProcessEntry32 с информацией о процессе:
Ты заметил сколько у этой структуры неиспользуемых полей. Это остатки прошлого, оставленные для совместимости. Скажем так, программерам Микрософта эта библиотека как-будто не нравится и они придумывают новые способы мониторинга системы. |
Сначала вызывается Process32First, а затем для каждого последующего процесса - Process32Next. Когда процессы для перечисления заканчиваются Process32Next возвращает False.
Функция GetLastError возвращает ERROR_NO_MORE_FILES если процессы для перечисления кончились или их вообще в снимке не было.
После использования хэндл снапшота надо закрыть (CloseHandle), чтобы не было утечки ресурсов.
unit Sample1;
interface
uses Classes;
function FillProcessesList(var
slProcesses: TStringList): Boolean;
implementation
uses Windows, SysUtils, tlhelp32,
Addition;
function FillProcessesList(var
slProcesses: TStringList): Boolean;
var
hSnap: THandle;
pe32: TProcessEntry32;
i: Integer;
begin
Result := False;
if slProcesses = nil then Exit;
// Проверяем кооректность параметра
// Пролучаем снапшот состояния системных объектов
hSnap :=
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// При ошибке - выходим
if hSnap = INVALID_HANDLE_VALUE
then Exit;
pe32.dwSize
:= SizeOf(TProcessEntry32);
// Обязательно заполняем поле размера
if not Process32First(hSnap, pe32)
then begin
CloseHandle(hSnap);
// Если процессов в снике не было, то закрываем хэнл
Exit;
// снимка и выходим с ошибкой
end;
i
:= 0; // инициируем счетчик
repeat
// Получаем инфу о каждом процессе из снапшота,
inc(i); // пока Process32Next не
возвратит False
slProcesses.Add(IntToStr(i) +
' - PID: ' +
IntToStr(pe32.th32ProcessID) +
' EXE NAME: ' +
pe32.szExeFile +
' Количество потоков: ' +
IntToStr(pe32.cntThreads)
+
' Базовый приоритет: ' +
IntToStr(pe32.pcPriClassBase));
until not Process32Next(hSnap,
pe32);
//
PrintError;
// Раскомментируй, чтобы смотреть коды ошибок
CloseHandle(hSnap);
// Обязательно закрываем хэндл снапшота
Result
:= True;
// Функция выполнилась успешно
end;
end.
Этот модуль выводит фактически всю полезную информацию, которую можно получить с помощью Process32First/ Process32Next. Потом ты можешь аналогично получить более конкретную информацию по каждому процессу используя: Heap32First/Heap32ListFirst,
Heap32ListNext/Heap32Next, Module32First/Module32Next, Thread32First/Thread32Next, Toolhelp32ReadProcessMemory. Как использовать эти функции и что они возвращают, написано в справке Windows SDK, которая идет вместе с Delphi.
Назад |
(с) tripsin aka Орехов Роман, 2006 г.