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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Создание dll с сигнал-слотами внутри для NoQt приложений. [РЕШЕНО]  (Прочитано 16450 раз)
Bepec
Гость
« Ответ #15 : Июль 24, 2013, 08:49 »

Подробнее:

Имеется подопытный процесс с неизвестным содержимым (ахз на чем написано).

Мы желаем внедрить в него свой код.

Самый простой способ - создать в процессе remoteThread и заставить его загрузить нашу dll.

dll грузится в контексте и адресном пространстве подопытного процесса. Всё гуд.

Хочется её отладить, вывести ошибки, смотреть сообщения.

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

Хочется варианта аля запихать свой отладочный Qt класс в dll. И вот тут начинаются чудеса.

Класс создаётся, конструктор и иже с ним отрабатывают.  Работоспособность равна прямым коннектам.

Запуск eventLoop не запускает обработку событий. Т.е. он запускается, виснет в exec и всё. Подвешивает dll. Сигналы как не доходили так и не доходят.


to Igors: Проблема что нет или есть, но нет доступа к главному потоку приложения. Показает язык
« Последнее редактирование: Июль 24, 2013, 08:51 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Запуск eventLoop не запускает обработку событий. Т.е. он запускается, виснет в exec и всё. Подвешивает dll. Сигналы как не доходили так и не доходят.
Где и как вы запускаете цикл событий?
Записан
Bepec
Гость
« Ответ #17 : Июль 24, 2013, 09:37 »

Ыть хочу спойлеры.

Вкратце - создаётся класс при подгрузке Dll.
Код:
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
)
{
        HWND currentHwnd_ = FindWindow(NULL, L"Debugger");

switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
{
appThread* t = new appThread;
                        QEventLoop loop;
                        loop.exec();
}
break;
case DLL_THREAD_ATTACH:
SendMessage(currentHwnd_, WM_SETTEXT, 0, (long)_T("DLL_THREAD_ATTACH..."));
break;
case DLL_THREAD_DETACH:
SendMessage(currentHwnd_, WM_SETTEXT, 0, (long)_T("DLL_THREAD_DETACH..."));
break;
case DLL_PROCESS_DETACH:
SendMessage(currentHwnd_, WM_SETTEXT, 0, (long)_T("DLL_PROCESS_DETACH..."));
break;
}
return TRUE;
}

В классе тупо таймер секундный и слот с посылкой сообщения.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Ну так правильно, что все останавливается на exec: запускается бесконечный цикл.
Нужно запускать отдельный поток и быстро выходить из DllMain. Улыбающийся
Записан
Bepec
Гость
« Ответ #19 : Июль 24, 2013, 09:47 »

Закавыка то в том, что сигналы то не идут.

По идее ж после exec класс созданный перед ним должен начать обрабатывать сигналы. Или я неправильно понимаю?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

По идее ж после exec класс созданный перед ним должен начать обрабатывать сигналы. Или я неправильно понимаю?
Должен, но дело может быть в венде. Венда скорее всего ждет выхода из DllMain и дождаться не может. А исследуемое приложение нормально работает после этого?

Нужно запускать отдельную нить, в ней создавать объект отладочного класса и запускать eventloop.
« Последнее редактирование: Июль 24, 2013, 09:59 от Old » Записан
Bepec
Гость
« Ответ #21 : Июль 24, 2013, 10:00 »

Нормально работает. Это ж в отдельно созданном потоке происходит. Т.е. предложение создать ещё один поток с классом и евент лупом. Попробую после обеда :-)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

По идее ж после exec класс созданный перед ним должен начать обрабатывать сигналы.
Не понял, откуда те сигналы возьмутся если приложение ничего не пошлет? Др словами перехват где/чего?
Записан
Bepec
Гость
« Ответ #23 : Июль 24, 2013, 10:12 »

А вот и напишите, Igors, где и чего нужно перехватывать для работы очереди событий.
Без воды, пожалуйста.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

А вот и напишите, Igors, где и чего нужно перехватывать для работы очереди событий.
Без воды, пожалуйста.
Ну насчет воды Вам бы лучше помолчать Улыбающийся Из Вашего первого поста я понял что есть НЕ Qt приложение и оно обращается к dll, т.е. экспорт ф-ции известны и Вы хотите реализовать их на Qt. Потом Вы вроде говорите что "содержимое неизвестно". Так как же понимать  Непонимающий
Записан
Bepec
Гость
« Ответ #25 : Июль 24, 2013, 12:07 »

Вы правильно поняли тему. Приложение обращается к dll. Экспорт функции известны.

Маленькое добавление - я внедряюсь в приложение посредством dll и от имени приложения дергаю интерфейсы dll. 

И да, возможно вы неверно или не столь усердно читали предыдущие сообщения.

В dll.
Есть класс.
В классе есть таймер.
В классе есть слот.
Таймер законнекчен со слотом.
Таймер запускается в конструкторе и не останавливается.
В слоте есть дебажный код, отправляющий сообщение "Signals activated".
Снаружи у dll стандартный интерфейс подключаемой dll "dllMain".
Которая вызывается при LoadLibrary.

Сигнал не доходит.

Всё.

И
Цитировать
А вот и напишите, Igors, где и чего нужно перехватывать для работы очереди событий.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

Отдельный поток, запускаемый в DllMain, в котором будет жить нужный объект с таймерами и слотами, решит все вопросы.

Записан
Bepec
Гость
« Ответ #27 : Июль 24, 2013, 12:21 »

Я попробую. Сейчас только чуть освобожусь Улыбающийся

PS помню помню я про это, у меня даже в листочке записано :-D
Записан
Bepec
Гость
« Ответ #28 : Июль 25, 2013, 15:38 »

Отдельный поток, запускаемый в DllMain, в котором будет жить нужный объект с таймерами и слотами, решит все вопросы.

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


http://qtsimple.blogspot.ru/2013/10/dll-noqt.html - результат и описание его воссоздание.
« Последнее редактирование: Октябрь 08, 2013, 17:24 от Bepec » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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