![]() |
![]() ![]() ![]() ![]() |
|
Как определить откуда был запущен процесс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 прямо в свой смартфон. Подпишитесь на наш :: Главная :: Процессы и Сервисы ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||