Форум: "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