Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.037 c
15-1143090734
vajo
2006-03-23 08:12
2006.04.16
USB контроллер не определяется


15-1143366250
Megabyte
2006-03-26 13:44
2006.04.16
Модель сети с сервером БД. Квант времени


2-1144004837
dimodim
2006-04-02 23:07
2006.04.16
Mailslotный чат


2-1144137890
Dyakon_Frost
2006-04-04 12:04
2006.04.16
Сколько раз встречается каждое слово в предложении!


15-1143440602
Димон
2006-03-27 10:23
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский