страничка tripsin'а


Главная | Статьи | Заметки | Файлы| Ссылки | я
Назад

Дальше

Получение списка процессов. 1 часть. Tool Help API.

Скачай демонстрационный проект (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 с информацией о процессе:

  TProcessEntry32 = packed record

    dwSize: DWORD;// Размер структуры. Надо обязательно заполнять это поле.

    cntUsage: DWORD;            // Не испрользуется. Всегда = 0.

    th32ProcessID: DWORD;       // Идентификатор (pid) процесса.

    th32DefaultHeapID: DWORD;   // Не испрользуется. Всегда = 0.

    th32ModuleID: DWORD;        // Не испрользуется. Всегда = 0.

    cntThreads: DWORD;          // Количество потоков у процесса           

    th32ParentProcessID: DWORD; // PID родителя процесса

    pcPriClassBase: Longint;    // Базовый приоритет процесса

    dwFlags: DWORD;             // Не испрользуется. Всегда = 0.

    szExeFile: array[0..MAX_PATH - 1] of Char; // Нультерминальная строка с именем процесса

  end;

 

Ты заметил сколько у этой структуры неиспользуемых полей. Это остатки прошлого, оставленные для совместимости. Скажем так, программерам Микрософта эта библиотека как-будто не нравится и они придумывают новые способы мониторинга системы.

Сначала вызывается 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 г.

Hosted by uCoz