Как определить откуда был запущен процессDelphi , Программа и Интерфейс , Процессы и СервисыКак определить откуда был запущен процесс
Автор: TAPAKAH Есть handle запущенного PE файла. Как определить откуда он был запущен? Я так предполагаю что getmodulefilename как и GetModuleHandle работает в рамках только своего процесса. А решить твою задачу .. можно так: Тут парочка моих любимых функций: uses tlhelp32; type TModuleArray = array of TModuleEntry32; // Возвращает список описаний (TModuleEntry32) модулей по идентификатору процесса function GetModulesListByProcessId(ProcessId: Cardinal): TModuleArray; implementation function GetModulesListByProcessId(ProcessId: Cardinal): TModuleArray; var hSnapshot: THandle; lpme: TModuleEntry32; procedure AddModuleToList; begin SetLength(Result, High(Result) + 2); Result[high(Result)] := lpme; end; begin SetLength(Result, 0); hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId); if hSnapshot = -1 then RaiseLastWin32Error; lpme.dwSize := SizeOf(lpme); if Module32First(hSnapshot, lpme) then begin AddModuleToList; while Module32Next(hSnapshot, lpme) do AddModuleToList; end; end; Исходный код var Wnd: hWnd; buff: array[0..127] of Char; //------------------------------------ Pid: Cardinal; modarr: TModuleArray; Name: string; //------------------------------------ begin StringGrid1.RowCount := 1; Wnd := GetWindow(Handle, gw_HWndFirst); while Wnd <> 0 do begin if (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then begin fillchar(name, sizeof(name), #0); GetWindowText(wnd, buff, sizeof(buff)); // if getmodulefilename(GetWindowLong(wnd,GWL_HINSTANCE),name,sizeof(name))=0 // then name:='Null'; //----------------------------------------- GetWindowThreadProcessId(Wnd, @Pid); modarr := GetModulesListByProcessId(Pid); name := 'Null'; for i := 0 to High(modarr) do begin if Integer(modarr[i].modBaseAddr) = $400000 then begin name := modarr[i].szExePath; break; end; end; //----------------------------------------- StringGrid1.Cells[0, StringGrid1.RowCount - 1] := StrPas(buff); StringGrid1.Cells[1, StringGrid1.RowCount - 1] := StrPas(name); StringGrid1.RowCount := StringGrid1.RowCount + 1; end; Wnd := GetWindow(Wnd, gw_hWndNext); end; StringGrid1.RowCount := StringGrid1.RowCount - 1; end; Статья Как определить откуда был запущен процесс раздела Программа и Интерфейс Процессы и Сервисы может быть полезна для разработчиков на Delphi и FreePascal. Комментарии и вопросыМатериалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Процессы и Сервисы ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |