Главная страница
    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.007 c
7-10466
Desperado
2003-05-20 08:34
2003.08.04
Програмка для учета времени в бильярдной


4-10532
Hint
2003-05-30 14:14
2003.08.04
ShellExecuteEx WaitForSingleObject


1-10255
PrettyFly
2003-07-20 13:22
2003.08.04
Framы - диверсанты ;-)


1-10194
Olga
2003-07-23 10:17
2003.08.04
Совместимость Delphi с Borland Pascal 7.0


11-10155
nsvi
2002-12-01 13:15
2003.08.04
Копирование файлов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский