Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение пути по pid, что у меня не так? 
V
    Опции темы
MotoArhangel
Дата 6.4.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2011

Репутация: нет
Всего: нет



Код

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;


Это сообщение отредактировал(а) MotoArhangel - 6.4.2011, 19:17
PM MAIL   Вверх
alexnef
Дата 6.4.2011, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 14.4.2010

Репутация: нет
Всего: нет



попробуй через SHGetPathFromIDList
PM MAIL   Вверх
A11MaNi
Дата 8.4.2011, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 5.4.2008
Где: россия, юфо

Репутация: нет
Всего: 1



Попробуй вот так.
У меня работало. (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;

PM MAIL ICQ   Вверх
MotoArhangel
Дата 8.4.2011, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 13.3.2011

Репутация: нет
Всего: нет



под 7 не работает(

Это сообщение отредактировал(а) MotoArhangel - 8.4.2011, 17:59
PM MAIL   Вверх
Keeper89
Дата 8.4.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



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


--------------------
PM MAIL WWW   Вверх
kami
Дата 8.4.2011, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



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

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

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

Это сообщение отредактировал(а) kami - 8.4.2011, 21:30
PM MAIL WWW   Вверх
Qu1nt
Дата 9.4.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



Мой вариант:
Код

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;

PM MAIL   Вверх
CodeMonkey
Дата 9.4.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



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


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

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




--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0751 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.