Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Код
VAR  Wnd : hWnd;
buff,name: ARRAY [0..127] OF Char;
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';
    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;

Она пишет или адресс к моему файлу или к библиотекам 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
Большое спасибо :p

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)