Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Подскажите почему возвращает путь только собственного приложения? [D7, WinXP]


Pit ©   (2006-01-29 18:34:00) 

Подскажите почему возвращает путь только собственного приложения?

procedure TForm1.Button1Click(Sender: TObject);
var
hSnapShot:  THandle;
modHandle:   HMODULE ;
uProcess:     PROCESSENTRY32;
r:                longbool;
buf:             array [0..128] of char;
begin
 ListBox1.Clear;
 hSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 if(hSnapShot<>0)then
 begin
   r:=Process32First(hSnapShot, uProcess);
   while r <> false do
   begin
     modHandle:= GetModuleHandle(uProcess.szExeFile);
     GetModuleFileName(modHandle,buf,sizeOf(buf));
     ListBox1.Items.Add(buf);
     r:=Process32Next(hSnapShot, uProcess);
   end;
   CloseHandle(hSnapShot);
 end;

end;


begin...end   (2006-01-30 16:37:00) [1]

> Pit ©   (29.01.06 21:26) [6]

Есть несколько ошибок и недочётов. Так будет лучше:

var
 hSnapshot, hProcess: THandle;
 PE: TProcessEntry32;
 Path: array [0..MAX_PATH] of Char;
begin
 hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 if hSnapshot <> INVALID_HANDLE_VALUE then
 begin
   PE.dwSize := sizeof(PE);
   if Process32First(hSnapshot, PE) then
     repeat
       hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, PE.th32ProcessID);
       if GetModuleFileNameEx(hProcess, 0, Path, sizeof(Path)) <> 0 then
         // добавление Path в список;
       CloseHandle(hProcess)
     until not Process32Next(hSnapshot, PE);
     CloseHandle(hSnapshot)
 end
end


Pit   (2006-01-30 12:29:00) [2]

Да kaZaNoVa вы правы это PROCESS_QUERY_INFORMATION or PROCESS_VM_READ подходит как нельзя лучше.Спасибо.


kaZaNoVa   (2006-01-30 09:40:00) [3]

Pit ©   (29.01.06 21:26) [6]

> ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,
> FALSE, ProcessId);

маленькая рекомендация ..  для запроса информации не всда нужены все права .. (их иногда может нехватить) - лучше PROCESS_QUERY_INFORMATION or PROCESS_VM_READ имхо ...


Pit   (2006-01-29 21:26:00) [4]

СПАСИБО ОГРОМНОЕ наконецто работает,но не всё как мне надо,
но направление поиска понятно.

procedure TForm1.Button1Click(Sender: TObject);
var
ProcessId:       integer;
hSnapShot:     THandle;
ProcessHandle: THandle;
ModHandle:      HMODULE  ;
uProcess:        PROCESSENTRY32;
r:                  longbool;
buf:               array [0..128] of char;
begin
ListBox1.Clear;
hSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnapShot<>0)then
begin
  r:=Process32First(hSnapShot, uProcess);
  while r <> false do
 begin
  ProcessId:= (uProcess.th32ProcessID);
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
  ModHandle:= GetModuleHandle(uProcess.szExeFile);
  GetModuleFileNameEx(ProcessHandle,ModHandle,buf,128);
  ListBox1.Items.Add(buf);
    r:=Process32Next(hSnapShot, uProcess);
  end;
  CloseHandle(hSnapShot);
end;

end;


begin...end   (2006-01-29 20:16:00) [5]

> Pit ©   (29.01.06 20:09) [4]

uses PsAPI


Pit   (2006-01-29 20:09:00) [6]

В моей Винде(XP) почему то не работает  GetModuleFileNameEx,
пишит -  Undeclared identifier: GetModuleFileNameEx
Все обьявления вроде сделал, и uses'ы и все остальные.
Всёравно спасибо буду ломать голову как это дело решить,есть к чему стремится.


begin...end   (2006-01-29 19:43:00) [7]

Я поспешил с ответом и несколько неправ в [1]: GetModuleHandle возвращает ноль потому, что передаваемый ей путь (или имя) вообще не имеет отношения к текущему процессу. Да и uProcess.dwSize перед вызовом Process32First не инициализируется...

> Pit ©   (29.01.06 19:21) [2]

Открыть процесс по uProcess.th32ProcessID (OpenProcess) и вызвать GetModuleFileNameEx. Не забыть закрыть хэндл процесса.


Pit   (2006-01-29 19:21:00) [8]

Как же решить эту проблемую
Подскажите пожалуйста как определить полный путь к файлу по хэндлу , по модулю или по имени чужого окна.


begin...end   (2006-01-29 18:58:00) [9]

Потому что на каждом проходе цикла в uProcess.szExeFile находится не полный путь к файлу процесса, а только его имя (да и то не всегда). Из-за этого GetModuleHandle не может определить хэндл модуля, и возвращает ноль. А функция GetModuleFileName передачу этого нуля в качестве параметра hModule рассматривает как желание получить путь к файлу, создавшему текущий процесс.


Наверх

Титульная страница Поиск, карта сайта Написать письмо