|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Поиск процесса и определение пути файла
Добрый день знатоки, волнует вопрос меня- как найти процесс и определить путь файла ехе (к примеру notpad++.exe) и что бы путь к файлу заносился в переменную. Буду благодарен !
|
#2
|
||||
|
||||
Цитата:
Также в разделе Система имеется как минимум 4 подобных примера |
#3
|
|||
|
|||
Цитата:
|
#4
|
|||
|
|||
Попробовал эту тему (прошу прощение если это считается рекламой): http://enter1.ru/%D0%BE%D0%BF%D1%80%...1%D1%81%D0%B0/ вроде то что надо. Но почему то у меня не работает (x64 у меня ось)
===================================== Очень странно работает, некоторые процессы определяет путь, некоторые нет ===================================== Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, AppEvnts,IdHttp, StdCtrls, tlhelp32, Grids; type TModuleArray = array of TModuleEntry32; TForm1 = class(TForm) Button2: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button2Click(Sender: TObject); private public end; var Form1: TForm1; function GetModulesListByProcessId(ProcessId : Cardinal) : TModuleArray; implementation {$R *.dfm} function GetModulesListByProcessId(ProcessId:Cardinal): TModuleArray; var hSnapshot: THandle; lpme: TModuleEntry32; procedure AddToList; begin SetLength(Result,High(Result)+2); Result[high(Result)]:=lpme; end; begin SetLength(Result,0); hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,ProcessId); lpme.dwSize:=SizeOf(lpme); if Module32First(hSnapshot,lpme) then begin AddToList; while Module32Next(hSnapshot,lpme) do AddToList; end; end; function get_path(pid: cardinal):string; var i:integer; marr: TModuleArray; begin marr:= GetModulesListByProcessId(Pid); result:='Null'; for i:=0 to High(marr) do begin if Integer(marr[i].modBaseAddr)=$400000 then begin result:= marr[i].szExePath; break; end; end end; function GetProcessId(pName: PChar): dword; var Snap: dword; Process: TPROCESSENTRY32; begin Result := 0; Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if Snap <> INVALID_HANDLE_VALUE then begin Process.dwSize := SizeOf(TPROCESSENTRY32); if Process32First(Snap, Process) then repeat if lstrcmpi(Process.szExeFile, pName) = 0 then begin Result := Process.th32ProcessID; CloseHandle(Snap); Exit; end; until not Process32Next(Snap, Process); Result := 0; CloseHandle(Snap); end; end; procedure TForm1.Button2Click(Sender: TObject); begin showmessage(get_path(GetProcessId(PCHAR('filezilla.exe')))); end; end. вот так код работает...а если к примеру я поменяю filezilla.exe на любой другой 32 битный процесс...не работает, пишет Null Последний раз редактировалось AirTex, 24.05.2014 в 15:28. |
#5
|
||||
|
||||
И правильно, ибо нефиг. В MSDN ведь ясно пишут:
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#6
|
|||
|
|||
Цитата:
============================================ Решил проблему, убрав условие if Integer(marr[i].modBaseAddr)=$400000 then begin Последний раз редактировалось AirTex, 25.05.2014 в 10:24. |
#7
|
||||
|
||||
Цитата:
Помимо этого даже Windows XP умеет грузить exe-шники по нестандартному, пусть и фиксированному адресу. Возможно, проверка в коде осталась со времен NT 4 или Windows 9x. Как в них на самом деле, не проверял. Не стоит путать форумы с богадельнями. © Bargest |