![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 ведь ясно пишут:
Цитата:
|
|
#6
|
|||
|
|||
|
Цитата:
============================================ Решил проблему, убрав условие if Integer(marr[i].modBaseAddr)=$400000 then begin Последний раз редактировалось AirTex, 25.05.2014 в 10:24. |
|
#7
|
||||
|
||||
|
Цитата:
Помимо этого даже Windows XP умеет грузить exe-шники по нестандартному, пусть и фиксированному адресу. Возможно, проверка в коде осталась со времен NT 4 или Windows 9x. Как в них на самом деле, не проверял. |