Попробовал эту тему (прошу прощение если это считается рекламой):
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