Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2010, 16:05   #1
Stipower
Новичок
Джуниор
 
Регистрация: 18.06.2010
Сообщений: 2
По умолчанию Отображение пути к файлу процесса

Добрый день, уважаемые форумчане!

Реализовал диспетчер задач с помощью StringGrid с колонками

1. имя файла
2. PID
3. потоки
4. Приоритет
(код прилагаю)

Хотелось бы сделать еще одну колонку, в которой бы отображался путь к запущенному файлу (C:\Windows\Notepad.exe например). Знаю, что есть аналогичные программы итп, но хотелось бы реализовать это самому.
К тому же очень поможет в случае блокировки "вирусом" запуска штатного диспетчера задач.

Как сие реализовать? Может быть плохо гуглил


Код
Код:
procedure TForm1.ProcessInfoToGrid(procinfogrid:TStringGrid);
var  hsnap: Thandle;
        procentry:  TProcessEntry32;
        k:byte;
begin
k:=1;
hsnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
procentry.dwSize:=sizeof(procentry);
Process32First(hsnap,procentry);
repeat
with procinfogrid do
 begin
  if k>rowcount-1 then
  rowcount:=rowcount+1;
  cells[0,k]:=procentry.szexefile;              
  cells[1,k]:=inttostr(procentry.th32ProcessID);  
  cells[2,k]:=inttostr(procentry.cntThreads);   
  cells[3,k]:=GetPriority(procentry.th32processid); 
 end;
k:=k+1;
until Process32Next(hsnap,procentry)<>true;
if k<procinfogrid.RowCount then procinfogrid.RowCount:=k;
CloseHandle(hsnap);
end;
Stipower вне форума Ответить с цитированием
Старый 18.06.2010, 16:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

http://www.programmersforum.ru/showthread.php?t=62723
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.06.2010, 16:49   #3
Баламут
Баламучу слегка...
Участник клуба
 
Аватар для Баламут
 
Регистрация: 01.11.2006
Сообщений: 1,585
По умолчанию

Или вот это: http://programmersforum.ru/showthread.php?t=103544
Правда в этом случае я делал упор на то, чтобы получить список с удаленной машины и иметь возможность убить процесс (опять же на удаленной машине). Кстати, уже не один раз помогло мне в случае блокировки "вирусом" штатного диспетчера задач

Последний раз редактировалось Баламут; 18.06.2010 в 16:52.
Баламут вне форума Ответить с цитированием
Старый 18.06.2010, 21:21   #4
Stipower
Новичок
Джуниор
 
Регистрация: 18.06.2010
Сообщений: 2
По умолчанию

Воспользовался этим кодом

Код:
. function ProcessFileName(PID: DWORD): string;
   var
     Handle: THandle;
   begin
     Result := '';
     Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
     if Handle <> 0 then
       try
         SetLength(Result, MAX_PATH);
        if FullPath then
         begin
           if GetModuleFileNameEx(Handle, 0, PChar(Result), MAX_PATH) > 0 then
             SetLength(Result, StrLen(PChar(Result)))
           else
             Result := '';
         end
         else
         begin
           if GetModuleBaseNameA(Handle, 0, PChar(Result), MAX_PATH) > 0 then
             SetLength(Result, StrLen(PChar(Result)))
           else
             Result := '';
         end;
       finally
         CloseHandle(Handle);
       end;
   end;
Как безболезненно убрать
Цитата:
if FullPath then
Очень хорошая задумка, но никак не впишу в свои каракули)
Stipower вне форума Ответить с цитированием
Старый 08.05.2019, 15:22   #5
куки
 
Регистрация: 02.05.2016
Сообщений: 4
По умолчанию

Вычислить полный путь к процессу по PID как x86 так и x64

Код:
uses Psapi;

function GetPathFromPID(const PID: cardinal): string;
type
  TQueryFullProcessImageName = function(hProcess: Thandle; dwFlags: DWORD; lpExeName: PChar; nSize: PDWORD): BOOL; stdcall;
var
  hProcess: THandle;
  path: array[0..MAX_PATH - 1] of char;
  QueryFullProcessImageName: TQueryFullProcessImageName;
  nSize: cardinal;
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
  if hProcess <> 0 then
  try

    if GetModuleFileNameEx(hProcess, 0, path, MAX_PATH) <> 0 then
    begin
      result := path;
    end
    else if Win32MajorVersion >= 6 then
    begin
      nSize := MAX_PATH;
      ZeroMemory(@path, MAX_PATH);
      @QueryFullProcessImageName := GetProcAddress(GetModuleHandle('kernel32'), 'QueryFullProcessImageNameW');
      if Assigned(QueryFullProcessImageName) then
        if QueryFullProcessImageName(hProcess, 0, path, @nSize) then
          Result := path;
    end;

  finally
    CloseHandle(hProcess)
  end
  else
    RaiseLastOSError;
end;
Robot

Последний раз редактировалось куки; 08.05.2019 в 15:29.
куки вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
По пути к файлу определить pid процесса Var17 Win Api 1 15.12.2009 11:33
Достать директории из полного пути к файлу Kuzya59 Общие вопросы Delphi 7 23.09.2009 13:08
Получение пути к файлу путем перетаскивания k1r1ch Общие вопросы Delphi 7 29.06.2009 21:19
изменение пути к файлу Обыватель Microsoft Office Excel 2 30.09.2008 13:16
Определение пути к файлу Pinya Общие вопросы Delphi 1 07.08.2008 12:22