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

Вниз

Полный путь к исполнимому файлу процесса.   Найти похожие ветки 

 
Tower   (2005-04-18 16:04) [0]

Здраствуйте.

Нужно получить список процессов, но не только имя для каждого процесса, а полный путь к исполнимому файлу из которого запущен процесс. Как это сделать?

Спасибо.


 
BiN ©   (2005-04-18 17:03) [1]

9x/ме - tool help функции
nt - GetModuleFileNameEx
для nt есть и более надежный (читай "сложный") метод, но, может, тебе пока хватит и этого.


 
Tower   (2005-04-18 18:03) [2]

А с какой версии есть GetModuleFileNameEx.
У меня Делфи 6 и в справке такой функции нет. Есть только GetModuleFileName.


 
BiN ©   (2005-04-18 18:15) [3]

Requirements
Client Requires Windows XP, Windows 2000 Professional, or Windows NT Workstation 4.0.

Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server 4.0.

Header
Declared in Psapi.h.

Library
Link to Psapi.lib.
DLL Requires Psapi.dll.

http://msdn.microsoft.com/library/en-us/perfmon/base/getmodulefilenameex.asp


 
Eraser ©   (2005-04-18 18:22) [4]

Tower

Исользуй tool help функции - они и там и там работают!


 
Tower   (2005-04-18 18:29) [5]

Вот что написал.

var Hs:Cardinal;lppe:PROCESSENTRY32;
begin
memo1.Clear;
hS:=CreateToolHelp32Snapshot(TH32CS_SNAPALL,0);
lppe.dwSize:=sizeof(PROCESSENTRY32);
Process32First(hS,lppe);
repeat
  memo1.Lines.Add(lppe.szExeFile)  ;
until not Process32next(hS,lppe);
CloseHandle(hS);
end;

Но возвращает только имена екзешников а не полные пути. В этом же форуме нашел, что пути будут возвращатся только под Вин98.
может есть еще какой то способ?


 
BiN ©   (2005-04-18 18:40) [6]

Eraser ©   (18.04.05 18:22) [4]

Исользуй tool help функции - они и там и там работают!


Работают, но по-разному. Пути в Nt не возвращают.

ower   (18.04.05 18:29) [5]

может есть еще какой то способ?


А чем GetModuleFileNameEx не устраивает


 
Lin7   (2005-04-18 18:46) [7]

Выдрал из рабочего проекта - если надо подправь. Soryy у меня сейчас времени нет даже просмотреть :)

procedure GetProcessList(SL:TStringList);
var
 pe:TProcessEntry32;
 ph, snap:THandle;//дескрипторы процесса и снимка
 mh:hmodule;//дескриптор модуля
 procs:array[0..$fff] of dword;//массив для хранения дескрипторов процессов
 count, cm:cardinal;//количество процессов
 i:integer;
 ModName:array[0..max_path] of char;//имя модуля
 Rez:integer;

 function FindProcID(ProcID:DWORD):integer;
 var
   i:integer;
 begin
   Result := -1;
   for i:=0 to SL.Count-1 do
     if ProcID= DWORD(SL.Objects[i]) then begin
       Result := i;
       break;
     end;
 end;

begin
 if Win32Platform = VER_PLATFORM_WIN32_WINDOWS then begin //если это Win9x
   snap:=CreateToolhelp32Snapshot(th32cs_snapprocess, 0);
   if integer(snap)=-1 then begin
     exit;
   end
   else begin
     pe.dwSize:=sizeof(pe);
     if Process32First(snap, pe) then
       repeat
         Rez := FindProcID(pe.th32ProcessID);
         if Rez<>-1 then
           SL[Rez] := pe.szExeFile;
       until not Process32Next(snap, pe);
     CloseHandle(snap);
   end;
 end
 else begin //Если WinNT/2000/XP
   if not EnumProcesses(@procs, sizeof(procs), count) then exit;
   for i := 0 to count div 4 - 1 do begin
     ph:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
        false, procs[i]);
     if ph>0 then begin
       EnumProcessModules(ph, @mh, 4, cm);
       Rez := FindProcID(procs[i]);
       if rez<>-1 then begin
         GetModuleFileNameEx(ph, mh, ModName, sizeof(ModName));
         SL[Rez] := ModName;
       end;
       CloseHandle(ph);
     end;
   end;
 end;
end;


 
Плохиш ©   (2005-04-18 18:48) [8]

>Tower   (18.04.05 18:29) [5]

Module32First/Module32Next


 
Tower   (2005-04-18 18:56) [9]

Вот как получилось. Здесь много лишнего но будет понятно.

var
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
len:integer;
Hs:Cardinal;lppe:MODULEENTRY32;
proc:Cardinal;
begin
ListBox1.Clear;
memo1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN {&#205;&#229; &#239;&#238;&#234;&#224;&#231;&#251;&#226;&#224;&#229;&#236;:}
   IF (Wnd <> Application.Handle) AND {-&#209;&#238;&#225;&#241;&#242;&#226;&#229;&#237;&#237;&#238;&#229; &#238;&#234;&#237;&#238;}
      IsWindowVisible(Wnd) AND {-&#205;&#229;&#226;&#232;&#228;&#232;&#236;&#251;&#229; &#238;&#234;&#237;&#224;}
      (GetWindow(Wnd, gw_Owner) = 0) AND {-&#196;&#238;&#247;&#229;&#240;&#237;&#232;&#232; &#238;&#234;&#237;&#224;}
      (GetWindowText(Wnd, buff, sizeof(buff)) <> 0){-&#206;&#234;&#237;&#224; &#225;&#229;&#231; &#231;&#224;&#227;&#238;&#235;&#238;&#226;&#234;&#238;&#226;}
   THEN BEGIN
     GetWindowText(Wnd, buff, sizeof(buff));
     ListBox1.Items.Add(StrPas(buff));
     //---Все кроме этого участка из FAQ сайта. А это я вставил.
     GetWindowThreadProcessId(Wnd,proc);
     hS:=CreateToolHelp32Snapshot(TH32CS_SNAPALL,proc);
     lppe.dwSize:=sizeof(MODULEENTRY32);
     Module32First(hS,lppe);
     memo1.Lines.Add(ansistring(lppe.szExePath)+":"+
      ansistring(lppe.szModule))  ;
     //----------
   END;

   Wnd := GetWindow(Wnd, gw_hWndNext);
 END;
 ListBox1.ItemIndex := 0;
end;



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

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

Наверх





Память: 0.48 MB
Время: 0.013 c
1-1116487474
dp200
2005-05-19 11:24
2005.06.06
Как програмно открыть файл в конкретном приложении


4-1113549534
старый маразматикЪ
2005-04-15 11:18
2005.06.06
Работаю с файлом при помощи ф-ций FileOpen FileRead FileWrite


14-1116591694
Digitman
2005-05-20 16:21
2005.06.06
Ох и засада этот IntraWeb !)


1-1116534544
Green_Templar
2005-05-20 00:29
2005.06.06
возведение в квадрат


1-1116501791
Shredder
2005-05-19 15:23
2005.06.06
Преобразование: строка -> число





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский