Показать сообщение отдельно
  #4  
Старый 24.05.2014, 11:05
AirTex AirTex вне форума
Прохожий
 
Регистрация: 01.05.2014
Сообщения: 17
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

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