Главная страница
    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.46 MB
Время: 0.058 c
2-1143817834
Malik
2006-03-31 19:10
2006.04.16
Автозагрузка самой программы


1-1140536806
SurgeonY
2006-02-21 18:46
2006.04.16
Linking VC++ static lib in Delphi (or BCB) project


1-1142254492
Nibbler
2006-03-13 15:54
2006.04.16
Работа с содержимым ScrollBox


2-1143773415
Barabashka
2006-03-31 06:50
2006.04.16
Небольшая проблема


2-1143304647
Первокласник Вася
2006-03-25 19:37
2006.04.16
Как клонировать объекты?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский