Получение списка процессов в Windows 9x и NT

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Автор: Евгений Пелега

WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****

>> Получение списка процессов в Windows 9x/NT

Определяет список модулей, запущенных в настоящее время в системе, и заносит их

имена в список TStrings. На Win9x использует функции ToolHelp32,

на NT/2000/XP — библиотеку PSAPI.dll

Зависимости: Windows, Classes, PSAPI, TlHelp32

Автор: Евгений Пелега, drpass@mail.ru, Донецк

Copyright: Евгений Пелега

Дата: 26 апреля 2002 г.

***************************************************** }

procedure GetProcessList(var sl: TStrings);

var

pe: TProcessEntry32;

ph, snap: THandle; //дескрипторы процесса и снимка

mh: hmodule; //дескриптор модуля

procs: array[0..$FFF] of dword; //массив для хранения дескрипторов процессов

count, cm: cardinal; //количество процессов

i: integer;

ModName: array[0..max_path] of char; //имя модуля

begin

sl.Clear;

if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then

begin //если это Win9x

snap := CreateToolhelp32Snapshot(th32cs_snapprocess, 0);

if integer(snap) = -1 then

begin

exit;

end

else

begin

pe.dwSize := sizeof(pe);

if Process32First(snap, pe) then

repeat

sl.Add(string(pe.szExeFile));

until not Process32Next(snap, pe);

end;

end

else

begin //Если WinNT/2000/XP

if not EnumProcesses(@procs, sizeof(procs), count) then

begin

exit;

end;

for i := 0 to count div 4 — 1 do

begin

ph := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,

false, procs[i]);

if ph > 0 then

begin

EnumProcessModules(ph, @mh, 4, cm);

GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));

sl.Add(string(ModName));

CloseHandle(ph);

end;

end;

end;

end;

Пример использования:

procedure TForm1.Button1Click(Sender: TObject);

var

tmp: TStrings;

begin

tmp := memo1.Lines;

GetProcessList(tmp);

end;

{/codecitation}

Добавить комментарий