Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.16;
Скачать: CL | DM;

Вниз

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

 
Pit ©   (2006-01-29 18:34) [0]

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

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-29 18:58) [1]

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


 
Pit ©   (2006-01-29 19:21) [2]

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


 
begin...end ©   (2006-01-29 19:43) [3]

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

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

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


 
Pit ©   (2006-01-29 20:09) [4]

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


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

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

uses PsAPI


 
Pit ©   (2006-01-29 21:26) [6]

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

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;


 
kaZaNoVa ©   (2006-01-30 09:40) [7]

Pit ©   (29.01.06 21:26) [6]

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

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


 
Pit ©   (2006-01-30 12:29) [8]

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


 
begin...end ©   (2006-01-30 16:37) [9]

> 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



Страницы: 1 вся ветка

Текущий архив: 2006.04.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
2-1143811753
dera
2006-03-31 17:29
2006.04.16
Как выбрать уникальные записи из таблицы?


15-1143298597
Sergey Masloff
2006-03-25 17:56
2006.04.16
Как преподаватели манипулируют студентами ;-)


15-1143382640
Бугага
2006-03-26 18:17
2006.04.16
Альтернатива www.webfile.ru


6-1136402386
Jenya
2006-01-04 22:19
2006.04.16
Как в Delphi 7.0 отправить письмо на E-mail?


15-1143125776
ZeFiR
2006-03-23 17:56
2006.04.16
Преобразование картинки в ASCII символы