Russian Qt Forum
Ноябрь 23, 2024, 01:48
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Создание dll с сигнал-слотами внутри для NoQt приложений. [РЕШЕНО]
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Создание dll с сигнал-слотами внутри для NoQt приложений. [РЕШЕНО] (Прочитано 16480 раз)
Bepec
Гость
Создание dll с сигнал-слотами внутри для NoQt приложений. [РЕШЕНО]
«
:
Июль 23, 2013, 10:27 »
Тема решена. Руководство по написанию dll
-
http://qtsimple.blogspot.ru/2013/10/dll-noqt.html
. Исходники там же.
Приветствую. Тут в связи с темой внедрения dll появилась необходимость в отладочной длл, которая позволяет рассылать и обрабатывать сообщения, дергая сишные функции.
Проблема: В библиотеке не работают сигнал-слоты
Что делал: почитал темы, понял основную мысль - нужно запускать свой event-loop/QCoreApplication в dll.
И тут встаёт вопрос - запуск event-loop'а в самой dll (в Dllmain при аттаче dll) убивает её (exec длится до бесконечности).
Запуск event-loop'a в отдельном потоке - сигнал-слоты не работают.
Как правильно сделать?
PS поиск терзал - пара результатов идут без окончательного решения.
«
Последнее редактирование: Октябрь 08, 2013, 21:10 от Bepec
»
Записан
Bepec
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений.
«
Ответ #1 :
Июль 23, 2013, 12:15 »
Пока что набрёл на кривой костыль.
Запустить луп, послать сигнал. В слоте убить первый луп и включить второй, основной. В результате программа пойдёт дальше исполняться и в dll появится цикл сообщений.
PS но криво как то
Мб кто подскажет получше вариант?
Записан
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Создание dll с сигнал-слотами внутри для NoQt приложений.
«
Ответ #2 :
Июль 23, 2013, 12:50 »
Смотря какая связь между сигнал-слотами нужна. С Qt::DirectConnection и без лупа должно работать, только тогда слот будет выполняться в потоке сигнала. А так да, придется извращаться
.
Записан
Пока сам не сделаешь...
Bepec
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений.
«
Ответ #3 :
Июль 23, 2013, 12:52 »
Direct - это стандартный прямой вызов. А нужна работа асинхронных интерфейсов аля QTcpSocket.
update: консольная утилита с таким извращение работать не хочет
Записан
Bepec
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений.
«
Ответ #4 :
Июль 23, 2013, 14:34 »
Сам себе отвечу.
Из-за ограничений QCoreApplication / QApplication должны быть вызваны в главном потоке (раз).
Exec может быть вызван только из того потока,в котором они были созданы (главный поток) (два).
Так же для корректной работы их обоих необходимо "окно" программы, получающее системные сообщения (верно для Windows). (три)
Вышеприведённые факты не позволяет использовать их в inject - dll. Да и в обычных не очень. (Верно для приложений, не имеющих собственного QApplication/QCoreApplication).
Исправить ситуацию вероятно можно, но необходимы серьёзные хаки. Засим тему считаю "Решенной".
PS было упоминание о некоей библиотеке, реализующей полнофункциональный цикл событий в dll, но к сожалению ссылки битые. Дополнительной информации нет
«
Последнее редактирование: Июль 23, 2013, 14:48 от Bepec
»
Записан
ViTech
Гипер активный житель
Offline
Сообщений: 858
Re: Создание dll с сигнал-слотами внутри для NoQt приложений.
«
Ответ #5 :
Июль 23, 2013, 15:06 »
Цитата: Bepec от Июль 23, 2013, 14:34
PS было упоминание о некоей библиотеке, реализующей полнофункциональный цикл событий в dll, но к сожалению ссылки битые. Дополнительной информации нет
Может это
QMfcApp
, костыль старый и заброшенный, но если сильно захотеть, то, наверное, можно прикрутить
.
Записан
Пока сам не сделаешь...
Bepec
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #6 :
Июль 23, 2013, 15:37 »
Вроде именно про него говорили. Скачал, смотрю.
Записан
Akon
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #7 :
Июль 23, 2013, 17:38 »
В длл не использовать поток приложения, а создать свой и в нем крутить эвентлооп для асинхронных сокетов.
Если же все-таки задаться целью не создавать дополнительные потоки, то нужно смотреть как QEventLoop сцепляется с API ::GetMessage() - возможно, будет зацепка.
Записан
Bepec
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #8 :
Июль 23, 2013, 19:44 »
У меня задачка чуть интереснее. Я инжектю dll в чужой процесс в отдельный поток ) Засим создать свой луп нельзя из-за вышеприведённых ограничений )
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #9 :
Июль 23, 2013, 19:47 »
Цитата: Bepec от Июль 23, 2013, 19:44
У меня задачка чуть интереснее. Я инжектю dll в чужой процесс в отдельный поток ) Засим создать свой луп нельзя из-за вышеприведённых ограничений )
Тогда в цикл того процесса нужно добавить обработку Qt очереди сообщений иначе никак.
Записан
Bepec
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #10 :
Июль 23, 2013, 20:42 »
В том и закавыка что это практически нереально
Я и бьюсь то над тем, чтобы перехватывать сообщения винды у процесса. Пока не очень получается - существуют ограничения )
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #11 :
Июль 23, 2013, 21:05 »
Цитата: Bepec от Июль 23, 2013, 20:42
В том и закавыка что это практически нереально
Я и бьюсь то над тем, чтобы перехватывать сообщения винды у процесса. Пока не очень получается - существуют ограничения )
Кто-то должен регулярно обрабатывать очередь Qt-сообщений. Если исследуемый процесс этого делать не может, нужно найти того, кто сможет.
Ну не знаю... можно запускать какой-то вендовый таймер, при срабатывании которого будет вызываться processEvents.
Записан
Bepec
Гость
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #12 :
Июль 23, 2013, 23:30 »
В том и закавыка. Я пока не очень понимаю принцип работы цикла событий Qt. Евент лупы гундят, exec'кутятся, но сигналы не доходят. application'ы не заводятся, возвращают вышеприведённые ошибки. Вроде грят с помощью вами упомянутой библиотеки могут создавать, но я пока не смог добиться никакого результата
PS информации море, полезной нет.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #13 :
Июль 24, 2013, 08:10 »
Расскажите подробней о задаче.
Можно использовать свой QEventLoop в каждой функции, можно запустить отдельный поток и в нем крутить этот цикл.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Создание dll с сигнал-слотами внутри для NoQt приложений. [Вывод - Нет решения]
«
Ответ #14 :
Июль 24, 2013, 08:47 »
Цитата: Akon от Июль 23, 2013, 17:38
В длл не использовать поток приложения, а создать свой и в нем крутить эвентлооп для асинхронных сокетов.
Не вижу почему это не должно работать. Ну плюс одна нитка - невеликая проблема. Посылать ей сигналы события (из главной) можно. Принимать - хоть по таймеру, а лучше синхронизировать через мутекс или семафор
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...