Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.05.2014, 16:19
AirTex AirTex вне форума
Прохожий
 
Регистрация: 01.05.2014
Сообщения: 17
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Поиск процесса и определение пути файла

Добрый день знатоки, волнует вопрос меня- как найти процесс и определить путь файла ехе (к примеру notpad++.exe) и что бы путь к файлу заносился в переменную. Буду благодарен !
Ответить с цитированием
  #2  
Старый 23.05.2014, 19:31
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,534
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от AirTex
Добрый день знатоки, волнует вопрос меня- как найти процесс и определить путь файла ехе (к примеру notpad++.exe) и что бы путь к файлу заносился в переменную. Буду благодарен !
http://www.delphisources.ru/pages/so...s-monitor.html

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

Цитата:
Сообщение от Admin
http://www.delphisources.ru/pages/so...s-monitor.html

Также в разделе Система имеется как минимум 4 подобных примера
Беда в том, что я запустил этот проект, он запускается все ок, но поле где должны быть процессы пустое
Ответить с цитированием
  #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

Последний раз редактировалось AirTex, 24.05.2014 в 15:28.
Ответить с цитированием
  #5  
Старый 24.05.2014, 19:21
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

И правильно, ибо нефиг. В MSDN ведь ясно пишут:
Цитата:
Сообщение от MSDN
TH32CS_SNAPMODULE

64-bit Windows: Using this flag in a 32-bit process includes the 32-bit modules of the process specified in th32ProcessID, while using it in a 64-bit process includes the 64-bit modules. To include the 32-bit modules of the process specified in th32ProcessID from a 64-bit process, use the TH32CS_SNAPMODULE32 flag.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #6  
Старый 25.05.2014, 08:36
AirTex AirTex вне форума
Прохожий
 
Регистрация: 01.05.2014
Сообщения: 17
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от Freeman
И правильно, ибо нефиг. В MSDN ведь ясно пишут:
вон я кинул скрипт (выше на пост от твоего), он отлично работает с 32 битными приложениями, но не со всеми. К примеру я пробовал файл зило определить путь, он показывает. Пробовал с скайпом - уже не работает
============================================
Решил проблему, убрав условие
if Integer(marr[i].modBaseAddr)=$400000 then begin

Последний раз редактировалось AirTex, 25.05.2014 в 10:24.
Ответить с цитированием
  #7  
Старый 25.05.2014, 19:22
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 577
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от AirTex
Решил проблему, убрав условие
if Integer(marr[i].modBaseAddr)=$400000 then begin
Это вообще глупое условие. В системах до Windows 7 ядро не умело грузить exe-шники не по фиксированному адресу, даже если перемещаемые символы в самом файле были. А потом появилась технология EMET, в которой ради защиты от вирусов адресное пространство процесса может перемешиваться, включая перемещение самого exe-шника.

Помимо этого даже Windows XP умеет грузить exe-шники по нестандартному, пусть и фиксированному адресу. Возможно, проверка в коде осталась со времен NT 4 или Windows 9x. Как в них на самом деле, не проверял.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter