|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 2, 2003 14:44:08 · Поправил: Four-F [ Quantum: Мне не совсем понятно какое отношение имеет диалог к тредам? ] Самое прямое. У каждого диалога есть диалоговая процедура, код которой нужно выполнять. Этим как раз поток и занимается. Причем только поток создавший диалог. Когда поток создает диалог, вызывая одну из многочисленных CreateDialogXXX или DialogBoxXXX, система создает очередь сообщений для этого диалога и сопоставляет ее с потоком вызвавшим эту функцию. Все сообщения приходящие в эту очередь будут обрабатываться именно этим потоком. Есть даже функция PostThreadMessage, с помощью которой можно поместить сообщение в очередь конкретного потока. [ Quantum: Диалог работает потому что модуль уже маппирован в память вместе с ресурсами и его instance является валидным. ] Диалог создается именно вызовом функции создания диалога (см. выше). Маппирование модуля в память, пусть даже в его ресурсах 100 диалогов, не приводит к созданию этих диалогов до тех пор, пока это не будет сделано явно. [ Quantum: Instance как-то связан с тредом? ] Нет. Поток никак не привязан к модулю его создавшему. А вот диалог да. Точнее его ресурс. При создании диалога нужно явно указать в каком модуле находится ресурс диалога. Прикола ради, я набросал простенькое приложение. Exe+Dll. В каждом модуле сидит один и тот же диалог - при линковке исползуется один rsrc.obj. Каждый модуль запускает диалог из своих ресурсов, используя свой hInstance. Exe запускает и обрабатывает свой диалог используя основной поток. Dll создает свой поток в DllMain и запускает с помощью него свой диалог. Оба диалога живут независимо друг от друга, до тех пор, разумеется, пока жив процесс. Если закрыть диалог созданный длл, то екзешный диалог, естественно, продолжает жить. Если закрыть екзешный диалог, то вызывается ExitProcess и оба диалога умирают, что тоже вполне естественно. Был бы блин аттач... придется так постить :-( Макросы из KmdKit. ============================================== exe.asm - собирается как обычно и в ресурсами ==============================================
============================================== dll.asm - для сборки юзать blddll.bat ==============================================
============================================== dll.def ==============================================
============================================== blddll.bat - батник для сбора длл ==============================================
============================================== rsrc.rc - ресурсы компилируются как обычно ==============================================
Эксперименты с этим проектом помогут снять все вопросы. ЗЫ: Блин, какое все-таки удовольствие получаешь пися... пиша... блин... от написания таких простых программулек. Это, наверное, мой самый длинный пост. Типа отпуск начался, вот я и маюсь... ;-) |
|
|
Дата: Июл 2, 2003 19:35:29 >Кстати, а что происходит после возвращения из DllMain? Возможно MessageBox просто не успевает показаться, если программа заканчивается СРАЗУ после вызова DLL. похоже так и было :/ ... буду пробовать еще варианты... и из ru.visual.cpp тоже написали, что из инита .dll нежелательно ничего делать, надо создавать отдельную функцию и в ней уже делать что хочется... >ЗЫ: Код Drakon_Rider у меня прекрасно работает, но всё-таки... эт радует :) ... значит и здесь когда-нить получится... |
|
|
Дата: Июл 2, 2003 22:41:46 [ Drakon_Rider: ...буду пробовать еще варианты... ] Ты реши сначала, а зачем оно вообще нужно создавать диалог из длл. Я могу придумать пару, чисто гипотетических вариантов, когда это может понадобиться, но... А так, в общем, можно создавать что угодно и откуда угодно, если понимаешь как и зачем. Пока не понятно, зачем тебе нужен диалог созданный из длл. |
|
|
Дата: Июл 2, 2003 23:36:13 > Я могу придумать пару, чисто гипотетических вариантов, когда это может понадобиться, но... Например если это какой-нибудь dll'ный plugin. |
|
|
Дата: Июл 2, 2003 23:41:23 Four-F Спасибо за наглядное объяснение! У меня есть похожий код. Сделал сьют с плагинами в отдельных DLL (ско-о-олько GPF'ов стерпел пока с тредами из под OOP разбирался...) Эксперименты с этим проектом помогут снять все вопросы Наоборот, вопросов станет больше :-) |
|
|
Дата: Июл 2, 2003 23:43:30 UnFleshed One Например если это какой-нибудь dll'ный plugin О! Классический пример. |
|
|
Дата: Июл 3, 2003 14:40:06 · Поправил: Four-F [ Quantum: Наоборот, вопросов станет больше :-) ] Тогда можно будет их спросить и жизнь будет продолжаться ;-) |
|
|
Дата: Июл 3, 2003 18:59:56 >Ты реши сначала, а зачем оно вообще нужно создавать диалог из длл. Я могу придумать пару, чисто гипотетических вариантов, когда это может понадобиться, но.. у меня ситуация - надо к древней игровой программе прикрутить новую технологию управления камерой (в дополнение к имеющейся)... соотв лучшим вариантом добавления своих инструкций ЦПУ получается внешняя .dll ... т.к. особливо после VC++ ного сбора .dll она размером почти как весь .exe игровой программы :/ ... соотв после запуска игровой программы мне надо проинициализировать устройства видеозахвата и вывести превьюшное изображение в отдельное окно, в котором надо мышекликнуть по некоторой точке и получить координаты этого мышеклика на последующую обработку... и при этом уже параллельно должна выполняться собственно игровая программа... так что это окно должно быт отдельным тредом получается... кроме того было бы хорошо, если бы в это окно можно было бы Alt+Tab из полноэкранного игрового режима и опять мышекликнуть по нему если надо указать новую точку... соотв во время выполнения игровой программы некоторые функции этой .dll получают медиасэмплы от устройства видеозахвата, вычисляют там кое-чего и изменяют настройки матриц 3D рендера игровой программы - каждый кадр - 25 фпс... загрузку .dll я уже прикрутил и нашел место, в котором вычисляется та самая матрица направления и сдвига камеры, так что с помощью 2..4 функций из .dll все может заработать... |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.072 |