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

Вниз

немодальное окно без помощи VCL в dll   Найти похожие ветки 

 
Вадим   (2003-03-10 13:24) [0]

Ситуация такая:
Программа при старте загружает dll и выгружает ее перед завершением работы. В dll надо создать немодальное невидимое окно, но вот возникает вопрос, в какую часть исходного кода этой dll следует поместить цикл сбора сообщений?


 
Suntechnic   (2003-03-10 19:45) [1]

А зачем тебе ещё один цикл обработки сообщений? Ты разве в этой dll ещё один поток создаёшь?

Более того... это будет вообще неправильно т.к. ф-ция из твоей dll может выполнятся как в контексте основного потока программы, так и в контексте совсем дургого потока, о котором ты в момент написания dll понятия не имеешь.

Очередь сообщений создаётся для потока, а не для окна, потому как окон у потока может быть много. Соответсвенно и цикл обработки этих сообщений должен создаваться тоже для потока, а не для окна.


P.S. Ксати есть такая ф-ция IsDialogMessage, которая обычно используется для немодальных диалоговых окон.


 
Игорь Шевченко   (2003-03-11 09:45) [2]


> в какую часть исходного кода этой dll следует поместить
> цикл сбора сообщений


Если цикла обработки сообщений в главной программе нет, то в любую часть кода DLL, лишь бы управление получала.


 
Suntechnic   (2003-03-11 17:37) [3]

Игорь Шевченко © (11.03.03 09:45)
Если цикла обработки сообщений в главной программе нет, то в любую часть кода DLL, лишь бы управление получала.


А что если я захочу из этой DLL ф-цию вызвать? Я ведь и не догадываюсь, что кто-то там цикл обработки сообщений дописал. Итог: я буду очень удивляться, почему после закрытия приложения моя программа останется в памяти висеть.


 
Игорь Шевченко   (2003-03-11 18:06) [4]

Suntechnic © (11.03.03 17:37)


> А что если я захочу из этой DLL ф-цию вызвать?


Коран не запрещает.

> Я ведь и не догадываюсь, что кто-то там цикл обработки сообщений
> дописал


К DLL обычно прикладывается описание ейных функций :-)


> я буду очень удивляться, почему после закрытия приложения
> моя программа останется в памяти висеть


Разве ?


 
Suntechnic   (2003-03-11 18:35) [5]

>Игорь Шевченко ©
К DLL обычно прикладывается описание ейных функций :-)

Угу, я себе это уже представил... и представил себе как бы я матерился увидев такое в описании ф-ции.

> я буду очень удивляться, почему после закрытия приложения
> моя программа останется в памяти висеть

Разве ?


Когда вы кликните крестик в основном окне программы, то в один из существующих циклов попадёт сообщение WM_QUIT. GetMessage "выберет" это сообщение из очереди и вернёт 0. Один из циклов закончится, но второй останется (WM_QUIT то один!) и основной поток будет ждать завершения этого цикла... будет ждать вечно... Или у Вас другой сценарий на этот случай предусмотрен?


 
nikkie   (2003-03-11 19:11) [6]

>Suntechnic
заметь, что Игорь поставил условие
>Если цикла обработки сообщений в главной программе нет

ситуация на самом деле не высосанная из пальца. представь себе, что код VCL оформлен в виде dll. тогда твоя программа -
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
ну и где цикл сообщений? в DLL... будешь материться? ;)

но твой первый пост, конечно абсолютно верен, в предположении, что цикл сообщений уже написан в exe. IsDialogMessage - тут не причем, поскольку автор сказал, что окно невидимое. А вот если б оно было диалогом и видимо, то требовались бы вызовы IsDialogMessage. в такой ситуации можно предложить создать новый поток и создать окно и написать цикл сообщений в нем. либо поставить хук.


 
Suntechnic   (2003-03-11 19:21) [7]

>nikkie © (11.03.03 19:11)
ситуация на самом деле не высосанная из пальца.
Ситуация на самом деле даже не из пальца высосана... :)

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
ну и где цикл сообщений?


Откройте исодники VCL и посмотрите что делает Application.Run

IsDialogMessage - тут не причем, поскольку автор сказал, что окно невидимое.

И ещё раз откройте MSDN и посмотрите что делает эта ф-ция. Видимость окна здесь ни причём.

в такой ситуации можно предложить создать новый поток и создать окно и написать цикл сообщений в нем. либо поставить хук.

Какие потоки... какие хуки... это вы о чём? Человек хочет создавать немодальное диалоговое окно в DLL. По вашему для этого поток отдельный надо создавать и хуками обвешиваться?


 
nikkie   (2003-03-11 19:42) [8]

>Suntechnic
не спеши высказываться. лучше внимательней читай, что пишут.

>Откройте исодники VCL и посмотрите что делает Application.Run

посмотрел - крутит цикл сообщений. я про это и говорю. повторяю еще раз: "представь себе, что код VCL оформлен в виде dll".

>И ещё раз откройте MSDN и посмотрите что делает эта ф-ция. Видимость окна здесь ни причём.

открываю MSDN

When IsDialogMessage processes a message, it checks for keyboard messages and converts them into selections for the corresponding dialog box. For example, the TAB key, when pressed, selects the next control or group of controls, and the DOWN ARROW key, when pressed, selects the next control in a group.

таким образом, вызов IsDialogMessage необходим, чтобы обрабатывался TAB и стрелки. если диалог невидим, то это вроде и ни к чему. если есть идея зачем еще нужно вызывать IsDialogMessage - милости просим.

>Какие потоки... какие хуки... это вы о чём?

объясняю еще раз. я в dll создаю свой немодальный диалог. мне нужен вызов IsDialogMessage с параметром hDlg. кто его и когда будет вызывать?


 
Suntechnic   (2003-03-11 19:58) [9]

>nikkie ©
Не надо с головы на ноги ставить. Код оформлен то в DLL, но вы привели пример моей программы(заметьте программы а не DLL) и поинтересовались где же там цикл. Я вам привел ответ.

таким образом, вызов IsDialogMessage необходим, чтобы обрабатывался TAB и стрелки. если диалог невидим, то это вроде и ни к чему. если есть идея зачем еще нужно вызывать IsDialogMessage - милости просим.

Вы не до конца читали описание ф-ции. IsDialogMessage делает необходимы манипуляции с сообщениями, харатерными для диалоговых окон (вы о них упоминули), но помимо этого она производит диспетчиризацию сообещний к диалоговому окну.

Because the IsDialogMessage function performs all necessary translating and dispatching of messages, a message processed by IsDialogMessage must not be passed to the TranslateMessage or DispatchMessage function.

Т.е. для того чтобы корректно обрабатывать немодальное диалоговое окно достаточно в цикле обработки сообщений программы(заметьте одно единственном, а не вновь созданном в DLL) вызвать эту ф-цию. Обычно это делается так:
while (GetMessage(&msg, NULL, NULL, NULL))
{
if (!IsWindow(ourDialogHwnd) || !IsDialogMessage(ourDialogHwnd, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}


И вообще об этой ф-ции я упомянул в P.S. только для того, чтобы автор вопроса знал о ней и при удобном случае использовал стандартные возможности Windows, а не занимался извращениями.

объясняю еще раз. я в dll создаю свой немодальный диалог. мне нужен вызов IsDialogMessage с параметром hDlg. кто его и когда будет вызывать?

Где и когда вызывать я уже сказал. Едиственное что вам потребуется это вернуть hwnd созданного в DLL окна для того, чтобы использовать в ф-ции IsDialogMessage.


 
nikkie   (2003-03-11 20:35) [10]

>Suntechnic
тяжело с тобой... ладно, объясню еще раз. только подумай 5 минут перед тем как в очередной раз меня уму учить...

итак, 2 ситуации (кстати, не совсем гипотетические - обе у меня встречались).

ситуация 1. я пишу свою оконную библиотеку (ну скажем, аналог VCL). оформляю эту библиотеку в виде DLL. программа, написанная, с использованием этой библиотеки будет выглядеть примерно так:
MyWindowLib_Initialize(...);
MyWindowLib_CreateWindow(...);
MyWindowLib_RunMessageLoop(...);

MyWindowLib_RunMessageLoop - собственно и крутит цикл сообщений. цикл этот находится в DLL. какие проблемы?

ситуация 2. в DLL я создаю немодальный диалог, цикл обработки сообщений находится в основной программе. хорошо, если я пишу и EXE и DLL сам, да еще на API. Тогда я могу передать хендл диалога и в EXE вызвать IsDialogMessage, как ты и написал. а что если EXE пишется на VB или на VCL? а что если я пишу ActiveX DLL?

идея с хуком описана в MSDN Knowledge Base (PRB: Modeless Dialog Box in a DLL Does Not Process TAB Key, ID: Q233263). в моем конкретном случае (composite ActiveX control на ATL) она почему-то не сработала, поэтому я сделал проще - с отдельным потоком.



теперь по поводу IsDialogMessage
>она производит диспетчиризацию сообещний к диалоговому окну
тем не менее, никто мне не запретит создать немодальный диалог и осуществлять диспетчиризацию с помощью TranslateMessage и DispatchMessage. ничего зазорного в этом нет. при этом не будет работать TAB. но если окно невидимо, то меня это и волновать не будет. заметь также, что в первоначальном вопросе про диалоги не было ни слова.

я думаю, твой первый пост, наиболее полезен, как ответ автору вопроса. скорее всего, ему цикл выборки сообщений и не нужен. тем не менее могут возникать ситуации, когда этот цикл помещается в DLL.


 
Suntechnic   (2003-03-11 22:14) [11]

>nikkie ©
тяжело с тобой...
Да ведь ты тоже не подарок.

только подумай 5 минут перед тем как в очередной раз меня уму учить...
Ну да конечно. Вот только ты мне расскажи к чему был тот вопрос про цикл сообщений? К чему он относился? Мне кажется, что ты просто ляпнул не подумав(ну с кем не бывает), а теперь с больной головы на здоровую перекладываешь. Ну да ладно, оставим эту тему и поговорим по существу...

ситуация 1. я пишу свою оконную библиотеку (ну скажем, аналог VCL). оформляю эту библиотеку в виде DLL. программа, написанная, с использованием этой библиотеки будет выглядеть примерно так:
MyWindowLib_Initialize(...);
MyWindowLib_CreateWindow(...);
MyWindowLib_RunMessageLoop(...);

MyWindowLib_RunMessageLoop - собственно и крутит цикл сообщений. цикл этот находится в DLL. какие проблемы?


Да проблемы в том (об этом я твержу сразу после поста И. Шевченко), что вы должны при таком подходе либо создавать свой собственный поток(об этом в посте Шевченко речь не шла), либо гарантировать то, что в основной программе не будет запущен цикл обработки сообщений(речь в этом посте как раз идёт об этом). Ну и как вы, поставщик подобной библиотеки можете это гарантировать? А вот что произойдёт, если кто-то попытается вызвать вашу библиотеку при наличии подобного цикла описано в посте Suntechnic © (11.03.03 18:35) И главное во имя чего это? Чего вы добиваетесь перенося цикл обработки сообщений из основной программы в DLL?

ситуация 2. в DLL я создаю немодальный диалог, цикл обработки сообщений находится в основной программе. хорошо, если я пишу и EXE и DLL сам, да еще на API. Тогда я могу передать хендл диалога и в EXE вызвать IsDialogMessage, как ты и написал. а что если EXE пишется на VB или на VCL? а что если я пишу ActiveX DLL?

Позвольте вам напомнить что хэндл всего лишь число типа int так что проблем с передачей этого числа нет нигде. Да и я уже говорил, что IsDialogMessage была упомянута всего лишь для общего развития.

тем не менее, никто мне не запретит создать немодальный диалог и осуществлять диспетчиризацию с помощью TranslateMessage и DispatchMessage. ничего зазорного в этом нет. при этом не будет работать TAB. но если окно невидимо, то меня это и волновать не будет. заметь также, что в первоначальном вопросе про диалоги не было ни слова.

См. ответ выше. На IsDialogMessage свет клином не сошёлся.

Думаю этот флейм пора заканчивать.


 
nikkie   (2003-03-12 00:26) [12]

>Suntechnic
>Да ведь ты тоже не подарок.

:)

>вы должны ... гарантировать то, что в основной программе не будет запущен цикл обработки сообщений ...

я сформулировал предназначение этой dll - оконная библиотека. тот, кто решает ей пользоваться, должен либо не использовать WinAPI, либо учитывать каким образом использование API может помешать функционированию библиотеки.

если ты используешь VCL в виде bpl - собственно нечто в этом роде и получается. ты же не возмущаешься, что твой цикл выборки сообщений не работает одновременно вместе с Application.Run.

>Чего вы добиваетесь перенося цикл обработки сообщений из основной программы в DLL?

например, потенциальной кросс-платформенности. возьми, к примеру, библиотеку Qt и приложения, написанные с ее использованием, например, CLX-приложения. где находится цикл выборки сообщений?

>Позвольте вам напомнить что хэндл всего лишь число типа int

проблема вовсе не в этом. проблема в том, что нужно вклиниться в цикл выбора сообщений. не уверен, но думаю, что на VB этого сделать нельзя. и при написании на VCL это не есть элементарная задача. безусловно решаемая, но по сути это просто лишняя головная боль для пользователя DLL. а ведь мы хотим сделать DLL удобной в использовании? microsoft не зря написала про хук.

>IsDialogMessage была упомянута всего лишь для общего развития

ок. давай считать, что все, что я наговорил - это тоже для общего развития. если тебе это кажется чушью - ну извини, насильно мил не будешь...


 
Suntechnic   (2003-03-12 00:48) [13]

>nikkie ©
Ok. Будем считать тему закрытой. В любом случае у автора вопроса после прочтения всей дискусси уже не должно остаться сомнений о принципах работы Windows с сообшениями, потоками и окнами... так что будем считать мы здесь не зря клавиатуру "топтали" :)


 
Игорь Шевченко   (2003-03-12 09:29) [14]

Suntechnic © (12.03.03 00:48)

Привет!

Компилируем приложение с run-time packages, и видим, что цикл обработки сообщений прекрасно себя чувствует в DLL с именем vclxx.bpl :-)))



 
Suntechnic   (2003-03-12 15:57) [15]

>Игорь Шевченко ©
Компилируем приложение с run-time packages, и видим, что цикл обработки сообщений прекрасно себя чувствует в DLL

А никто и не утверждает что ему там станет плохо и он работать перестанет :)

Парни из Борланд сами контролируют весь процесс начиная от основного окна и заканчивая циклами сообщений и т.д. и т.п. Они создали библиотеку для разработки exe, dll и ещё чёрт знает чего... А мы тут обсуждаем создание обычной DLL используя только Win API. Так что сравнивать тут просто нечего.


 
Игорь Шевченко   (2003-03-12 16:34) [16]

Suntechnic © (12.03.03 15:57)
> А мы тут обсуждаем создание обычной DLL используя только
> Win API. Так что сравнивать тут просто нечего.


Разве ? Найди, плз, 10 отличий :-)))


 
Suntechnic   (2003-03-12 17:48) [17]

>Игорь Шевченко ©
Разве ? Найди, плз, 10 отличий :-)))

Когда ты мне продемонстрируешь экспорт класса из обычной DLL, тогда наша дискуссия сразу перейдёт на новый уровень :)))


 
Игорь Шевченко   (2003-03-12 18:04) [18]

Suntechnic © (12.03.03 17:48)

А какое отношение экпорт класса имеет к циклу выборки сообщений ?
И эта...я думаю, наша дискуссия мало кому интересна, если есть желание продолжить, плиз, на почту :-)


 
Suntechnic   (2003-03-12 21:06) [19]

>Игорь Шевченко ©
А какое отношение экпорт класса имеет к циклу выборки сообщений ?

Ну а причём тут цикл обработки сообщений в run-time package?

Ты спросил какие такие отличия между тем что сочинила Борланд и обычной DLL... я ответил.

И эта...я думаю, наша дискуссия мало кому интересна, если есть желание продолжить, плиз, на почту

Да честно говоря она уже и мне самому неинтересна :)), так что давай её наверное вообще закончим.



Страницы: 1 вся ветка

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

Наверх





Память: 0.52 MB
Время: 0.005 c
1-34482
Zilog
2003-04-29 16:21
2003.05.12
Народ!! Подскажите pls как в ListBox связать строчку с указателем


1-34408
zloy_dima
2003-04-30 11:53
2003.05.12
Динамический массив


1-34403
Бедный
2003-04-29 18:58
2003.05.12
создание 500000 картинок..или взгляды психа на жизнь...


8-34512
jee
2003-01-31 16:15
2003.05.12
Тоновый набор


3-34334
Ergoist
2003-04-22 02:59
2003.05.12
DBGrid и расположение данных





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