Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Вниз

Все тот же 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.011 c
3-10146
Вит
2003-07-11 16:40
2003.08.04
Здравствуйте, мастера. Вопрос по хранимой процедуре


1-10208
Prov
2003-07-22 09:21
2003.08.04
Фон едита и цвет текста


3-10122
Slv
2003-07-11 12:08
2003.08.04
Синхронное падение 2-х IB серверов


7-10470
Pahsik
2003-05-24 04:12
2003.08.04
Добавление юзера к файлу


1-10183
MVova
2003-07-21 17:39
2003.08.04
Деление на 0





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский