Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать какие библиотеки DLL сейчас запущены в оперативке?


AJ_UA ©   (2003-06-13 15:50:00) 

Как узнать какие библиотеки DLL сейчас запущены в оперативке?
Это должна быть АРІ функция?


AJ_UA   (2003-06-18 18:18:00) [1]

ок. попробую!


Digitman   (2003-06-18 15:54:00) [2]

вот фрагмент работы с ToolHelp, разбирайся сам


procedure TForm1.Button1Click(Sender: TObject);
var
pe: PProcessEntry32;
te: PThreadEntry32;
me: PModuleEntry32;
avail: Boolean;
li: TListItem;

begin
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if hSnapshot <> INVALID_HANDLE_VALUE then
try
// енумерация процессов в системе
New(pe);
try
pe.dwSize := SizeOf(TProcessEntry32);
avail := Process32First(hSnapshot, pe^);
lvwProcessList.items.clear;
while avail do begin
li := lvwProcessList.Items.Add;
li.Caption := IntToHex(pe.th32ProcessID, 8); // id процесса
li.Subitems.Add(string(PChar(@pe.szExeFile))); // имя процесса
li.Subitems.Add(IntToStr(pe.pcPriClassBase)); // базовый класс приоритета
li.Subitems.Add(IntToHex(pe.th32ParentProcessID, 8)); // id род.процесса
li.Subitems.Add(IntToStr(pe.cntUsage)); // счетчик обращений
li.Subitems.Add(IntToStr(pe.cntThreads)); // число тредов
li.Subitems.Add(IntToHex(pe.th32DefaultHeapID, 8)); // id кучи по-умолчанию
li.Subitems.Add(IntToHex(pe.th32ModuleID, 8)); // id модуля, не путать с хэндлом модуля

avail := Process32Next(hSnapshot, pe^);
end;
finally
Dispose(pe);
end;
//енумерация тредов в системе*************************
New(te);
try
te.dwSize := SizeOf(TThreadEntry32);
avail := Thread32First(hSnapshot, te^);
lvwThreadList.items.clear;
while avail do begin
li := lvwThreadList.Items.Add;
li.Caption := IntToHex(te.th32ThreadID, 8); // id треда
li.Subitems.Add(IntToHex(te.th32OwnerProcessID, 8)); // id процесса-владельца
li.Subitems.Add(IntToStr(te.cntUsage)); // сч-к обращений
li.Subitems.Add(IntToStr(te.tpBasePri)); // баз.приоритет
li.Subitems.Add(IntToStr(te.tpDeltaPri)); // отн.приоритет

avail := Thread32Next(hSnapshot, te^);
end;
finally
Dispose(te);
end;
//енумерация модулей всех процессов в системе ****************
New(me);
try
me.dwSize := SizeOf(TModuleEntry32);
avail := Module32First(hSnapshot, me^);
lvwModuleList.items.clear;
while avail do begin
li := lvwModuleList.Items.Add;
li.Caption := IntToHex(me.th32ModuleID, 8); // id модуля
li.Subitems.Add(IntToHex(me.th32ProcessID, 8)); // id процесса, в ВАП которого модуль отображен
li.Subitems.Add(string(PChar(@me.szModule))); // имя модуля
li.Subitems.Add(string(PChar(@me.szExePath))); // путь к файлу модуля
li.Subitems.Add(IntToStr(me.GlblcntUsage)); // глоб.сч-к обращений
li.Subitems.Add(IntToStr(me.ProccntUsage)); // сч-к выгрузки
li.Subitems.Add(IntToHex(Integer(me.modBaseAddr), 8)); // баз.адрес модуля в ВАП процесса
li.Subitems.Add(IntToHex(me.modBaseSize, 8)); // размер модуля в ВАП процесса
li.Subitems.Add(IntToHex(me.hModule, 8)); // хэндл модуля

avail := Module32Next(hSnapshot, me^);
end;
finally
Dispose(me);
end;


finally
( hSnapshot)

вот фрагмент работы с ToolHelp, разбирайся сам


procedure TForm1.Button1Click(Sender: TObject);
var
pe: PProcessEntry32;
te: PThreadEntry32;
me: PModuleEntry32;
avail: Boolean;
li: TListItem;

begin
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if hSnapshot <> INVALID_HANDLE_VALUE then
try
// енумерация процессов в системе
New(pe);
try
pe.dwSize := SizeOf(TProcessEntry32);
avail := Process32First(hSnapshot, pe^);
lvwProcessList.items.clear;
while avail do begin
li := lvwProcessList.Items.Add;
li.Caption := IntToHex(pe.th32ProcessID, 8); // id процесса
li.Subitems.Add(string(PChar(@pe.szExeFile))); // имя процесса
li.Subitems.Add(IntToStr(pe.pcPriClassBase)); // базовый класс приоритета
li.Subitems.Add(IntToHex(pe.th32ParentProcessID, 8)); // id род.процесса
li.Subitems.Add(IntToStr(pe.cntUsage)); // счетчик обращений
li.Subitems.Add(IntToStr(pe.cntThreads)); // число тредов
li.Subitems.Add(IntToHex(pe.th32DefaultHeapID, 8)); // id кучи по-умолчанию
li.Subitems.Add(IntToHex(pe.th32ModuleID, 8)); // id модуля, не путать с хэндлом модуля

avail := Process32Next(hSnapshot, pe^);
end;
finally
Dispose(pe);
end;
//енумерация тредов в системе*************************
New(te);
try
te.dwSize := SizeOf(TThreadEntry32);
avail := Thread32First(hSnapshot, te^);
lvwThreadList.items.clear;
while avail do begin
li := lvwThreadList.Items.Add;
li.Caption := IntToHex(te.th32ThreadID, 8); // id треда
li.Subitems.Add(IntToHex(te.th32OwnerProcessID, 8)); // id процесса-владельца
li.Subitems.Add(IntToStr(te.cntUsage)); // сч-к обращений
li.Subitems.Add(IntToStr(te.tpBasePri)); // баз.приоритет
li.Subitems.Add(IntToStr(te.tpDeltaPri)); // отн.приоритет

avail := Thread32Next(hSnapshot, te^);
end;
finally
Dispose(te);
end;
//енумерация модулей всех процессов в системе ****************
New(me);
try
me.dwSize := SizeOf(TModuleEntry32);
avail := Module32First(hSnapshot, me^);
lvwModuleList.items.clear;
while avail do begin
li := lvwModuleList.Items.Add;
li.Caption := IntToHex(me.th32ModuleID, 8); // id модуля
li.Subitems.Add(IntToHex(me.th32ProcessID, 8)); // id процесса, в ВАП которого модуль отображен
li.Subitems.Add(string(PChar(@me.szModule))); // имя модуля
li.Subitems.Add(string(PChar(@me.szExePath))); // путь к файлу модуля
li.Subitems.Add(IntToStr(me.GlblcntUsage)); // глоб.сч-к обращений
li.Subitems.Add(IntToStr(me.ProccntUsage)); // сч-к выгрузки
li.Subitems.Add(IntToHex(Integer(me.modBaseAddr), 8)); // баз.адрес модуля в ВАП процесса
li.Subitems.Add(IntToHex(me.modBaseSize, 8)); // размер модуля в ВАП процесса
li.Subitems.Add(IntToHex(me.hModule, 8)); // хэндл модуля

avail := Module32Next(hSnapshot, me^);
end;
finally
Dispose(me);
end;


finally
CloseHandle(hSnapshot);
end;
end;


AJ_UA   (2003-06-18 14:49:00) [3]


> Digitman

извини за мои глупые вопросы, но я просто раньше никогда не пользовался системными ф-циями, тем более процессами.....Подскажы плз,ну вот моя (вообщето не моя, подсказали) ф-ция выводит запущеные процессы а чего нужно вставить еще туда, чтобы показывались модули этого процесса???


Digitman   (2003-06-18 09:43:00) [4]


> AJ_UA


какая еще "иная" ? ты спросил, что подставлять в кач-ве факт.параметра PID в ф-цию, предложенную Burmistroff (14.06.03 00:43), я тебе и сказал - идентификаторы процессов, которые ты получаешь в procs[i] в (13.06.03 16:33).
Собственно, я не понимаю, зачем тебе код от Burmistroff - для NT-based систем ты и в своем коде делаешь тоже самое. А для Win9x для каждого полученного при перечислении с пом. Process32First/Next процесса просто нужно перечислить его модули с пом. Module32First/Next


AJ_UA   (2003-06-17 19:02:00) [5]

так там же иная функция.....
а есть ли какая-то процедура которая не имеет входных параметров, а только результат(например результат TStrings)?


Digitman   (2003-06-17 10:27:00) [6]


> AJ_UA


как это не знаешь ? а это что в твоем коде :

procs[i] ???


AJ_UA   (2003-06-17 10:17:00) [7]

чего нужно подставлять во входные параметры [PID](я ж ведь не знаю идентивикатор процесса), [р] ?


AJ_UA   (2003-06-17 09:55:00) [8]

а как надо использовать процедуру EnumPrMod ???


Burmistroff   (2003-06-14 00:43:00) [9]


pmrec = record
hMod: DWORD;
Name: string;
end;
PrModList= array of pmrec;
PPRModList = ^PrModList;


procedure EnumPrMod(PID: DWORD; p: PPRModList);
var
ProcHand, cs1, cs2: DWORD;
e: array [0..1023] of DWORD;
ModName: array [0..511] of char;
begin
ProcHand := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if EnumProcessModules(ProcHand, @e, sizeof(e), cs2) then
begin
cs2:=cs2 div 4;
SetLength(p^, cs2+1);
p^[0].hMod:=cs2+1;
for cs1:=1 to cs2 do
begin
p^[cs1].hMod:=e[cs1-1];
GetModuleFileNameEX(ProcHand, e[cs1-1], @ModName[0], SizeOf(ModName));
p^[cs1].Name:=StrPas(PChar(@ModName[0]));
end;
( ProcHand)


pmrec = record
hMod: DWORD;
Name: string;
end;
PrModList= array of pmrec;
PPRModList = ^PrModList;


procedure EnumPrMod(PID: DWORD; p: PPRModList);
var
ProcHand, cs1, cs2: DWORD;
e: array [0..1023] of DWORD;
ModName: array [0..511] of char;
begin
ProcHand := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if EnumProcessModules(ProcHand, @e, sizeof(e), cs2) then
begin
cs2:=cs2 div 4;
SetLength(p^, cs2+1);
p^[0].hMod:=cs2+1;
for cs1:=1 to cs2 do
begin
p^[cs1].hMod:=e[cs1-1];
GetModuleFileNameEX(ProcHand, e[cs1-1], @ModName[0], SizeOf(ModName));
p^[cs1].Name:=StrPas(PChar(@ModName[0]));
end;
end;
CloseHandle(ProcHand);
end;


AJ_UA   (2003-06-13 16:42:00) [10]

Впринцыпе они ведь не отображаються в Диспетчере задач...а как их можна увидеть в среде Windows ???


AJ_UA   (2003-06-13 16:33:00) [11]

ну я использовал:


procedure GetProcessList(var sl:TStrings);
var
pe:TProcessEntry32;
ph, snap:THandle;//


AJ_UA   (2003-06-13 15:56:00) [12]

а нуна какой-то модуль подключать?


clickmaker   (2003-06-13 15:55:00) [13]

EnumProcesses, OpenProcess, EnumProcessModules, GetModuleFileNameEx


Наверх

Титульная страница Поиск, карта сайта Написать письмо