Russian Qt Forum
Апреля 25, 2025, 07:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Создание dll с сигнал-слотами внутри для NoQt приложений. [РЕШЕНО]  (Прочитано 16937 раз)
Bepec
Гость
« : Июля 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
Гость
« Ответ #1 : Июля 23, 2013, 12:15 »

Пока что набрёл на кривой костыль.

Запустить луп, послать сигнал. В слоте убить первый луп и включить второй, основной. В результате программа пойдёт дальше исполняться и в dll появится цикл сообщений.

PS но криво как то Веселый Мб кто подскажет получше вариант?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #2 : Июля 23, 2013, 12:50 »

Смотря какая связь между сигнал-слотами нужна. С Qt::DirectConnection и без лупа должно работать, только тогда слот будет выполняться в потоке сигнала. А так да, придется извращаться Улыбающийся.
Записан

Пока сам не сделаешь...
Bepec
Гость
« Ответ #3 : Июля 23, 2013, 12:52 »

Direct - это стандартный прямой вызов. А нужна работа асинхронных интерфейсов аля QTcpSocket.

update: консольная утилита с таким извращение работать не хочет Грустный
Записан
Bepec
Гость
« Ответ #4 : Июля 23, 2013, 14:34 »

Сам себе отвечу.

Из-за ограничений QCoreApplication / QApplication должны быть вызваны в главном потоке (раз).
Exec может быть вызван только из того потока,в котором они были созданы (главный поток) (два).
Так же для корректной работы их обоих необходимо "окно" программы, получающее системные сообщения (верно для Windows). (три)

Вышеприведённые факты не позволяет использовать их в inject - dll. Да и в обычных не очень. (Верно для приложений, не имеющих собственного QApplication/QCoreApplication).

Исправить ситуацию вероятно можно, но необходимы серьёзные хаки. Засим тему считаю "Решенной".

PS было упоминание о некоей библиотеке, реализующей полнофункциональный цикл событий в dll, но к сожалению ссылки битые. Дополнительной информации нет Грустный
« Последнее редактирование: Июля 23, 2013, 14:48 от Bepec » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #5 : Июля 23, 2013, 15:06 »

PS было упоминание о некоей библиотеке, реализующей полнофункциональный цикл событий в dll, но к сожалению ссылки битые. Дополнительной информации нет Грустный

Может это QMfcApp, костыль старый и заброшенный, но если сильно захотеть, то, наверное, можно прикрутить Улыбающийся.
Записан

Пока сам не сделаешь...
Bepec
Гость
« Ответ #6 : Июля 23, 2013, 15:37 »

Вроде именно про него говорили. Скачал, смотрю.
Записан
Akon
Гость
« Ответ #7 : Июля 23, 2013, 17:38 »

В длл не использовать поток приложения, а создать свой и в нем крутить эвентлооп для асинхронных сокетов.

Если же все-таки задаться целью не создавать дополнительные потоки, то нужно смотреть как QEventLoop сцепляется с API ::GetMessage() - возможно, будет зацепка.
Записан
Bepec
Гость
« Ответ #8 : Июля 23, 2013, 19:44 »

У меня задачка чуть интереснее. Я инжектю dll в чужой процесс в отдельный поток ) Засим создать свой луп нельзя из-за вышеприведённых ограничений )
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Июля 23, 2013, 19:47 »

У меня задачка чуть интереснее. Я инжектю dll в чужой процесс в отдельный поток ) Засим создать свой луп нельзя из-за вышеприведённых ограничений )
Тогда в цикл того процесса нужно добавить обработку Qt очереди сообщений иначе никак.
Записан
Bepec
Гость
« Ответ #10 : Июля 23, 2013, 20:42 »

В том и закавыка что это практически нереально Веселый
Я и бьюсь то над тем, чтобы перехватывать сообщения винды у процесса. Пока не очень получается - существуют ограничения )
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Июля 23, 2013, 21:05 »

В том и закавыка что это практически нереально Веселый
Я и бьюсь то над тем, чтобы перехватывать сообщения винды у процесса. Пока не очень получается - существуют ограничения )
Кто-то должен регулярно обрабатывать очередь Qt-сообщений. Если исследуемый процесс этого делать не может, нужно найти того, кто сможет.
Ну не знаю... можно запускать какой-то вендовый таймер, при срабатывании которого будет вызываться processEvents.
Записан
Bepec
Гость
« Ответ #12 : Июля 23, 2013, 23:30 »

В том и закавыка. Я пока не очень понимаю принцип работы цикла событий Qt. Евент лупы гундят, exec'кутятся, но сигналы не доходят. application'ы не заводятся, возвращают вышеприведённые ошибки. Вроде грят с помощью вами упомянутой библиотеки могут создавать, но я пока не смог добиться никакого результата Показает язык

PS информации море, полезной нет.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Июля 24, 2013, 08:10 »

Расскажите подробней о задаче.
Можно использовать свой QEventLoop в каждой функции, можно запустить отдельный поток и в нем крутить этот цикл.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июля 24, 2013, 08:47 »

В длл не использовать поток приложения, а создать свой и в нем крутить эвентлооп для асинхронных сокетов.
Не вижу почему это не должно работать. Ну плюс одна нитка - невеликая проблема. Посылать ей сигналы события (из главной) можно. Принимать - хоть по таймеру, а лучше синхронизировать через мутекс или семафор
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.034 секунд. Запросов: 23.