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

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

Реально ли узнать 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]

У приложения нет главного окна


Наверх

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