![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Полный путь к исполнимому файлу процесса.
Tower © (2005-04-18 16:04:00)Здраствуйте.
Нужно получить список процессов, но не только имя для каждого процесса, а полный путь к исполнимому файлу из которого запущен процесс. Как это сделать?
Спасибо.
Tower (2005-04-18 18:56:00) [1]Вот как получилось. Здесь много лишнего но будет понятно.
var
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
len:integer;
Hs:Cardinal;lppe:MODULEENTRY32;
proc:Cardinal;
begin
ListBox1.Clear;
memo1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd 0 DO BEGIN {Íå ïîêàçûâàåì:}
IF (Wnd Application.Handle) AND {-Ñîáñòâåííîå îêíî}
IsWindowVisible(Wnd) AND {-Íåâèäèìûå îêíà}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Äî÷åðíèè îêíà}
(GetWindowText(Wnd, buff, sizeof(buff)) 0){-Îêíà áåç çàãîëîâêîâ}
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
//---Все кроме этого участка из FAQ сайта. А это я вставил.
GetWindowThreadProcessId(Wnd,proc);
hS:=CreateToolHelp32Snapshot(TH32CS_SNAPALL,proc);
lppe.dwSize:=sizeof(MODULEENTRY32);
Module32First(hS,lppe);
memo1.Lines.Add(ansistring(lppe.szExePath)+':'+
ansistring(lppe.szModule)) ;
//----------
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end;
Плохиш (2005-04-18 18:48:00) [2]>Tower (18.04.05 18:29) [5]
Module32First/Module32Next
Lin7 (2005-04-18 18:46:00) [3]Выдрал из рабочего проекта - если надо подправь. Soryy у меня сейчас времени нет даже просмотреть :)
procedure GetProcessList(SL:TStringList);
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;//имя модуля
Rez:integer;
function FindProcID(ProcID:DWORD):integer;
var
i:integer;
begin
Result := -1;
for i:=0 to SL.Count-1 do
if ProcID= DWORD(SL.Objects[i]) then begin
Result := i;
break;
end;
end;
begin
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
Rez := FindProcID(pe.th32ProcessID);
if Rez<>-1 then
SL[Rez] := pe.szExeFile;
until not Process32Next(snap, pe);
CloseHandle(snap);
end;
end
else begin //Если WinNT/2000/XP
if not EnumProcesses(@procs, sizeof(procs), count) then exit;
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);
Rez := FindProcID(procs[i]);
if rez<>-1 then begin
GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
SL[Rez] := ModName;
end;
CloseHandle(ph);
end;
end;
end;
end;
BiN (2005-04-18 18:40:00) [4]Eraser © (18.04.05 18:22) [4]
Исользуй tool help функции - они и там и там работают!
Работают, но по-разному. Пути в Nt не возвращают.
ower (18.04.05 18:29) [5]
может есть еще какой то способ?
А чем GetModuleFileNameEx не устраивает
Tower (2005-04-18 18:29:00) [5]Вот что написал.
var Hs:Cardinal;lppe:PROCESSENTRY32;
begin
memo1.Clear;
hS:=CreateToolHelp32Snapshot(TH32CS_SNAPALL,0);
lppe.dwSize:=sizeof(PROCESSENTRY32);
Process32First(hS,lppe);
repeat
memo1.Lines.Add(lppe.szExeFile) ;
until not Process32next(hS,lppe);
CloseHandle(hS);
end;
Но возвращает только имена екзешников а не полные пути. В этом же форуме нашел, что пути будут возвращатся только под Вин98.
может есть еще какой то способ?
Eraser (2005-04-18 18:22:00) [6]Tower
Исользуй tool help функции - они и там и там работают!
BiN (2005-04-18 18:15:00) [7]Requirements
Client Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.
Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.
Header
Declared in Psapi.h.
Library
Link to Psapi.lib.
DLL Requires Psapi.dll.
http://msdn.microsoft.com/library/en-us/perfmon/base/getmodulefilenameex.asp
Tower (2005-04-18 18:03:00) [8]А с какой версии есть GetModuleFileNameEx.
У меня Делфи 6 и в справке такой функции нет. Есть только GetModuleFileName.
BiN (2005-04-18 17:03:00) [9]9x/ме - tool help функции
nt - GetModuleFileNameEx
для nt есть и более надежный (читай "сложный") метод, но, может, тебе пока хватит и этого.