![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Реально ли узнать Handle главного окна приложения, вызвавшего [D6, Win2k]
Cosinus © (2005-01-20 10:26:00)некоторую функцию из Dll, из самой Dll? И если да, то как?
Eraser (2005-01-20 18:12:00) [1]Cosinus ©
Давно проверенный вариант. Берёшь ID вызывающего потока и при инициализации dll передаёшь его ей. А потом для посылки сообщений используй SendThreadMessage. Проблемы могут возникнуть если в библиотеке используются хуки, или она исользуется другими процессами. Тут уж надо пренимать меры по разграничению памяти.
Erik1 (2005-01-20 17:42:00) [2]Ну если поизнащатся то можно и стек вызово раскрутить. :)
Cosinus (2005-01-20 16:57:00) [3]
> BiN © (20.01.05 15:16) [3]
Ступил. Сильно ступил. Так мне и надо. Спасибо.
> Digitman © (20.01.05 15:22) [5]
Потуги уже сделаны :)
GuAV (2005-01-20 15:25:00) [4]А почему бы не просто не передать dll-ке хендл формы ? Или вернуть из dll указатель на глобальную переменную, которую заполнить хендлом формы ?
> форма Main_fm:TMain_fm. Из нее вызываются некоторые
> функции из dll.
Можно узнать ID процесса, найти в нём окно класса TApplication, и найти окна у которых owner = HWND TApplication - это и будут формы приложения.
Определить вызвана ли процедура из метода формы или нет в общем случае не представляется возможным.
Digitman (2005-01-20 15:22:00) [5]
> Cosinus
и вообще - если не сделать опред.потуги к тому чтобы в системе всякий момент времени существовал лишь ОДИН экземпляр процесса твоего приложения, то вполне возможно существование более чем одного окна класса 'TMain_fm' с именем'Main'. И кому, спрашивается, будет адресовано твое сообщение ? Ответ : первому же найденному в системе окну с данныи атрибутами. Прочие окна с теми же атрибутами останутся ч.н. "с носом".
Вот теперь сиди и чеши репу, в тот ли огород ты полез ..
Digitman (2005-01-20 15:17:00) [6]
> Есть единственная avtocreate форма Main_fm:TMain_fm
начнем с того, что окно этой формы - вовсе не единственное и вовсе не "главное" окно в приложении, создавшем эту форму.
BiN (2005-01-20 15:16:00) [7]А передавать хэндл целевого окна через параметр функции в длл не приходило в голову?
Cosinus (2005-01-20 15:01:00) [8]
> BiN © (20.01.05 10:29) [1]
Простите за путанницу в терминологии. Но вы же поняли что я хотел спросить? Если нет, попробую объяснить. Есть приложение. Есть единственная avtocreate форма Main_fm:TMain_fm. Из нее вызываются некоторые функции из dll. При определенных условиях Dll шлет этому окну приложения сообщение. Так вот меня интересует реально ли в библиотеке определить, откуда она была вызвана или придется делать что то наподобие этогоMHND:=FindWindow('TMain_fm','Main');
if MHND<>0 then PostMessage()....
Дело в том, что видимо эту библиотеку я буду использовать не раз, и не хотелось бы каждый раз ее перекомпилировать под новое приложение.
BiN (2005-01-20 10:29:00) [9]У приложения нет главного окна