Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Все тот же Instance [D7, WinME]


R4D][ ©   (2003-05-30 16:30:00) 

Может кто-нить знает как пользоваться 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.

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


jack128   (2003-05-31 17:13:00) [1]

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


Suntechnic   (2003-05-31 16:57:00) [2]

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


Неправда.

The CreateToolhelp32Snapshot function takes a snapshot of the specifiedprocesses in the system.

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

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


jack128   (2003-05-31 16:03:00) [3]

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


R4D][   (2003-05-31 12:12:00) [4]

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


Suntechnic   (2003-05-30 21:05:00) [5]

>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.


jack128   (2003-05-30 19:44:00) [6]

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


panov   (2003-05-30 19:41:00) [7]

>reonid © (30.05.03 18:48)

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


reonid   (2003-05-30 18:48:00) [8]

Фишка в том, что 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);


Наверх

Титульная страница Поиск, карта сайта Написать письмо