Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.04;
Скачать: CL | DM;

Вниз

Все тот же Instance   Найти похожие ветки 

 
R4D][   (2003-05-30 16:30) [0]

Может кто-нить знает как пользоваться GetModuleFileName для другого процесса. Например, у меня окно с caption"ом "Окно". Вот, что я делаю:
var
WinHandle : HWND;
FileBuf : PChar;
WinInstance: HWND;
nado : HWND;
Skolko : Integer;
begin
WinHandle:=FindWindow(nil,PChar("Окно"));
nado:=WinHandle;
repeat
WinHandle:=nado;
nado:=GetParent(WinHandle);
until nado=0;
WinInstance:=GetWindowLong(WinHandle,GWL_HINSTANCE);
GetMem(FileBuf,255);
Skolko:=GetModuleFileName(WinInstance,filebuf,255);
FreeMem(FileBuf);
GetMem(FileBuf,Skolko+1);
Skolko:=GetModuleFileName(WinInstance,FileBuf,Skolko+1);
ShowMessage("Сколько байт скопировано - "+IntToStr(Skolko));
if Skolko=0 then ShowMessage("Last Error - "+IntToStr(GetLastError()));
ShowMessage(FileBuf);
FreeMem(FileBuf);


В данном примере у меня было 2 варианта:
1) Функция GetWindowLong возвращает МОЙ Instance и GetModuleFileName добросовестно находит расположение моей проги...
2) Функция GetWindowLong возвращает Instance не равный моему, но GetModuleFileName возвращает 0. GetLastError дает 0.

Господа, в чем фишка???


 
reonid ©   (2003-05-30 18:48) [1]

Фишка в том, что Instance - это адрес загрузки модуля
в адресном пространстве того процесса, в который этот
модуль загружен. В адр.пр. твоего процесса по этому адресу
может быть загружен какой-нибудь модуль, а может быть
и нет. Вот твои два варианта.

На самом деле твою задачу можно решить при помощи ф-й ToolHelp:

uses TlHelp32;

var
...
ModuleName: string;
hSnsh, PrID: THandle;
pME: TModuleEntry32;
res: Boolean;
begin
...

// Получаешь ИД процесса
GetWindowThreadProcessId(WinHandle, @PrID);

WinInstance:=GetWindowLong(WinHandle,GWL_HINSTANCE);

// Создаешь снапшот дляч данного процесса с флагом
// TH32CS_SNAPMODULE - то есть включаешь в него информацию
// о модулях данного процесса
hSnsh := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PrID);

// Проходишся по всем модулям
res := True;
Module32First(hSnsh, pME);
while res do
begin
if Longint(pME.modBaseAddr) = WinInstance then
// Ты нашёл свой модуль
// (Инстанс и базовый адрес - по сути одно и то же)
begin
// Искомое имя
ModuleName := pME.szModule{szExePath};
Break;
end;
res := Module32Next(hSnsh, pME);
end;
// Освобождаешь снэпшот
CloseHandle(hSnsh);


 
panov ©   (2003-05-30 19:41) [2]

>reonid © (30.05.03 18:48)

Добавлю дёгтя... в Windows NT этот пример работать не будет.
-)


 
jack128 ©   (2003-05-30 19:44) [3]

только учти что это именно для Win9x, к сожелению в WinNT toolhelp отсутствует, а в Win2000 возврощается только имя ехе - файла, но не путь к нему...


 
Suntechnic ©   (2003-05-30 21:05) [4]

>jack128 ©
в Win2000 возврощается только имя ехе - файла, но не путь к нему...

Имя само по себе, а путь... тоже сам по себе

Из описания Module32First:

szModule
Pointer to a null-terminated string that specifies the module name.
szExePath
Pointer to a null-terminated string that specifies the module path.


 
R4D][   (2003-05-31 12:12) [5]

Спасибо большое всем.


 
jack128 ©   (2003-05-31 16:03) [6]

Suntechnic © (30.05.03 21:05)
человеку нужен путь к ПРОЦЕССУ(не текущему), а не к модулю.
А Module32First/Module32Next - возврощает модули загруженные текущим(твоим) процессом.


 
Suntechnic ©   (2003-05-31 16:57) [7]

>jack128 © (31.05.03 16:03)
А Module32First/Module32Next - возврощает модули загруженные текущим(твоим) процессом.


Неправда.

The CreateToolhelp32Snapshot function takes a snapshot of the specified processes in the system.

Specified это не есть текущий и уж тем более не мой. Specified этот тот, PID которого я укажу.

Для того, чтобы убедиться в этом лично, запустите пример reonid © (30.05.03 18:48) хотя бы для случая с win калькулятором.


 
jack128 ©   (2003-05-31 17:13) [8]

мна был не прав...мои извенения...
просто Process32First возврощает только имя файла, я и подумал, что с модулями тоже.
и насчет
> возврощает модули загруженные текущим(твоим) процессом.
тоже неправ, sorry



Страницы: 1 вся ветка

Текущий архив: 2003.08.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
7-10484
Alta
2003-05-23 07:36
2003.08.04
Права на печать


4-10507
Pashik
2003-06-01 13:36
2003.08.04
Добавление юзера к файлу


4-10530
Maxus
2003-05-27 21:15
2003.08.04
Как изменить цвет меню c помошью ф-й WinAPI?


3-10096
seregin
2003-07-14 10:48
2003.08.04
ошибка в IB-базе


14-10378
Soft
2003-07-16 18:13
2003.08.04
Поучительный рассказ по поводу лицензионного софта