Russian Qt Forum
Ноябрь 23, 2024, 01:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Создание dll с сигнал-слотами внутри для NoQt приложений. [РЕШЕНО]  (Прочитано 16467 раз)
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
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

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

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

Сообщений: 4350



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

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

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

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

Сообщений: 4350



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

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

Сообщений: 11445


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

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


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