Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Определение пути по pid


Автор: MotoArhangel 6.4.2011, 19:10
Код

Function tform1.GetFilePath(PID: Cardinal): String;
var
  hproc        :    THandle;
  Buffer    :    Array[0..MAX_PATH] of Char;
  S         :    DWORD;
  IsWow64Result: BOOL;
const
  PROCESS_QUERY_LIMITED_INFORMATION = $00001000; //Vista and above
  AccessRights: array[Boolean] of DWORD = (PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, PROCESS_QUERY_LIMITED_INFORMATION);
begin
if PID > 0 then
  begin
    hproc := OpenProcess(AccessRights[IsWinVistaorAbove], False, PID);
      if IsWin2K then begin
        S := GetProcessImageFileNameW(hproc, buffer, Length(buffer));
        if S>0 then begin
          Result := DevicePathToWin32Path(Copy(buffer, 1, S));
        end
      end
      else begin
        if(Assigned(QueryFullProcessImageNameW) and (QueryFullProcessImageNameW(hproc, 0, Buffer, @S) > 0)) then begin
          if S>0 then
            Result := Copy(buffer, 1, S);
        end;
      end;
       CloseHandle(hproc);
    end;
  end;

Что у меня не так написано?

Да и продолжение корявого кода))) Не буду врать, знакомый поделился сеим кусочком.
Код

function DevicePathToWin32Path(path:string):string;
var
  c:char;
  s:string;
  i:integer;
  _path : String;
begin
  _path := path;
  i:=posex('\', path, 2);
  i:=posex('\', path, i+1);
  result:=copy(path, i, length(path));
  delete(path, i, length(path));
  for c:='A' to 'Z' do
  begin
    setlength(s, 1000);
    if querydosdevice(pchar(string(c)+':'), pchar(s), 1000)<>0 then
    begin
      s:=pchar(s);
      if sametext(path, s) then
      begin
        result:=c+':'+result;
        exit;
      end;
    end;
  end;
  result := _path;
end;

Автор: alexnef 6.4.2011, 20:50
попробуй через SHGetPathFromIDList

Автор: A11MaNi 8.4.2011, 08:47
Попробуй вот так.
У меня работало. (Win XP)

Код

uses
 tlhelp32, Psapi;


Код

function GetModulePath(PID: DWord): string;
var
  cb: DWORD;
  I: Integer;
  ProcCount: Integer;
  hMod: HMODULE;
  hProcess: THandle;
  PIDArray: array[0..1023] of DWORD;
  ModuleName: array[0..300] of Char;

begin
  FillChar(ModuleName, SizeOf(ModuleName), #0);
  EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for I := 0 to ProcCount - 1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
      False, PIDArray[I]);
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
      if PID = PIDArray[I] then
        Result := ModuleName;
      CloseHandle(hProcess);
    end;
  end;
end;

Автор: MotoArhangel 8.4.2011, 17:59
под 7 не работает(

Автор: Keeper89 8.4.2011, 18:05
Я просто лежу от отсутствия желания разобраться, и сразу дачи советов "попробуй, у меня работало" smile  

Автор: kami 8.4.2011, 21:27
Цитата(Keeper89 @  8.4.2011,  18:05 Найти цитируемый пост)
от отсутствия желания разобраться,

smile
А я до сих пор не понял сути вопроса, а без этого - лень даже копировать код в тестовый проект.
Цитата(MotoArhangel @  6.4.2011,  19:10 Найти цитируемый пост)
Что у меня не так написано?

В каком плане - что не так написано? Не компилируется? Выдает не то, о чем думалось и мечталось? В каком конкретно месте загвоздка, какая из функций отрабатывает не так, как нужно? Где дебаггерские обработки GetLastError и иже с ними? Что код "говорит" под отладчиком? И так далее, и тому подобное.

Автор: Qu1nt 9.4.2011, 13:52
Мой вариант:
Код

uses
  PsAPI;

function GetProcessPath(const ProcessId: Cardinal): String;
var
  Process: THandle;
  Buffer: array[0..Pred(MAX_PATH)] of Char;
begin
  Result := '';
  Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessId);
  if Process <> 0 then
  begin
    if GetModuleFilenameEx(Process, 0, Buffer, Length(Buffer)) <> 0 then
      Result := ExtractFilePath(Buffer);
    CloseHandle(Process);
  end;
end;

Автор: CodeMonkey 9.4.2011, 17:07
Цитата(MotoArhangel @  6.4.2011,  20:10 Найти цитируемый пост)
Что у меня не так написано?


Между // и Vista нет пробела:

Цитата(MotoArhangel @  6.4.2011,  20:10 Найти цитируемый пост)
//Vista and above


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)