Как определить откуда был запущен процесс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, использует функции Windows API для перебора окон и модулей процесса. Для определения места запуска процесса можно использовать функцию Однако данный подход может не подходить для ваших требований, потому что он работает только для процессов, запущенных с рабочего стола. В коде, который вы предоставили, нет прямого способа определить место запуска PE-файла. Функция Альтернативный подход, который вы упомянули, использует юнит Чтобы достичь вашего цели, вам может потребоваться использовать дополнительные техники, такие как:
Вот модифицированная версия вашего кода, которая демонстрирует использование функции
Обратите внимание, что функция В статье описано, как использовать функции из библиотеки ToolHelp для определения источника запуска процесса PE-файла по его handle. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Процессы и Сервисы ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |