| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Откуда запустили? |
| Автор: Mikel 11.5.2002, 10:16 |
| Есть handle запущенного PE файла. Как определить откуда он был запущен? |
| Автор: TAPAKAH 11.5.2002, 17:05 |
| GetModuleFileName |
| Автор: Mikel 12.5.2002, 07:09 |
| Уже пробовал. Не получилось. Поподробнее плз. |
| Автор: TAPAKAH 12.5.2002, 11:52 |
| Слушай .. а что именно не получилось то ??? function GetModuleName(Module: HMODULE): string; var ModName: array[0..MAX_PATH] of Char; begin SetString(Result, ModName, Windows.GetModuleFileName(Module, ModName, SizeOf(ModName))); end; |
| Автор: Mikel 14.5.2002, 07:13 | ||
Она пишет или адресс к моему файлу или к библиотекам OLE. А остальное нет. |
| Автор: TAPAKAH 14.5.2002, 10:57 |
| Ну в общем я взял .. потестировал... Я так предполагаю что эта функция .. 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; |
| Автор: Mikel 15.5.2002, 06:38 |
| Большое спасибо |