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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отладка DLL с хуком  (Прочитано 6753 раз)
QuAzI
Гость
« : Январь 08, 2012, 03:04 »

Нашкрябал простенькую DLL с main и процедуркой-хуком. Скормил её основной проге через QLibrary. Всё, библиотечка подгружается, функция из неё получается, хук устанавливается (соответственно всё имеет ненулевые адреса и вроде как всё красиво). Но даже элементарный qDebug() библиотека не возвращает, хотя само приложение в qDebug() возвращает всё-всё, даже когда отладку запускаю из проекта библиотеки (скопировал туда бинарник и в параметрах запуска указал его). Как же тогда отлаживать DLL?
И второй вопрос: как бы между приложением и библиотекой организовать обмен данными, есть у Qt что-то в этом плане или дёргать родные методы каждой ОС самому?
Записан
Bepec
Гость
« Ответ #1 : Январь 08, 2012, 05:15 »

Организуй простой вывод в лог к примеру. Насколько я помню, QDebug выводит данные в консоль по умолчанию, если не переопределено, а консоль у дллки ты видимо фиг откроешь. Улыбающийся
Записан
merke
Гость
« Ответ #2 : Январь 08, 2012, 06:19 »

Отлаживать библиотеки очень тяжело, я в основном использую в графических приложениях месагбоксы, я в консольных логирование. Если библиотека срет в консоль, то её вывод должен отображаться в консоли родительского приложения. Насчет взаимодействия я посоветую использовать СИГНАЛЫ и СЛОТЫ.
Записан
QuAzI
Гость
« Ответ #3 : Январь 08, 2012, 18:33 »

Ну, вроде в файл всё ложится нормально, а вот как в винде между разными приложениями сигналы/слоты Qt выглядят я немного плохо представляю. В экземпл никто не потычет?
Записан
merke
Гость
« Ответ #4 : Январь 08, 2012, 18:36 »

Между разными не получится, хотя где то видел подобную реализацию здесь на форуме. Тебе нужно следующее если у тебя приложение в которое ты подключаешь библиотеки на Qt да и сами либы написаны тоже на Qt то подобное ты сможешь реализовать легко, главное наследоваться от QObject
Записан
merke
Гость
« Ответ #5 : Январь 08, 2012, 18:42 »

Что то типо этого

Код
C++ (Qt)
QLibrary myLib("mylib");
typedef void (*QObject)();
QObjectmyFunction = (Qobject) myLib.resolve("mysymbol");
if (myFunction)
    myFunction();

А в либе делаешь простой публичный слот, в него будешь передавать данные из основного приложения, и сигнал, его будешь испускать и ловить в главном приложении
« Последнее редактирование: Январь 08, 2012, 18:44 от Александр » Записан
QuAzI
Гость
« Ответ #6 : Январь 09, 2012, 14:37 »

А в либе публичный слот зачем? Мне надо что-то из куха возвращать. Словил нужное событие - передал приложению. В общем всё равно плохо догоняю, во что на винде сигналы/слоты транслируются. Думаю, стоит запилить нужный функционал в самой либе и не маяться.
Записан
mutineer
Гость
« Ответ #7 : Январь 09, 2012, 14:53 »

В общем всё равно плохо догоняю, во что на винде сигналы/слоты транслируются.

Транслируются в вызовы методов-слотов или в передачу QEvent в QEventLoop с последующим вызовом метода-слота
Записан
QuAzI
Гость
« Ответ #8 : Январь 09, 2012, 17:09 »

В общем сделал всё нужное в либе, осталось только выводить поверх чужого приложения меню с вариантами выбора действия. Но ни меню, ни даже сообщение QMessageBox::critical(0, "dll", "error"); не могу вывести, текущее приложение сразу падает (при этом моё приложение из которого крутится DLL продолжает работать и валить окна, где срабатывает хук).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Январь 09, 2012, 18:32 »

Может это и "не тот случай" но если речь о Вындоуз, то оба (exe и dll) должны быть скомпилены однообразно: напр exe как Multithreaded DLL - значит и dll так же. Если используется STL то дефайны для них должны быть теми же и.т.д.
Записан
QuAzI
Гость
« Ответ #10 : Январь 09, 2012, 19:03 »

Никаких мультитредов и прочего. Вроде как нужно сварганить QApplication, но еик параметры надо argc/argv.
Это работает
Код:
MessageBox(active, L"Join us at Inferno Dev!", L"DLL Message", MB_OK | MB_ICONINFORMATION);
А на этом падает.
Код:
QMessageBox::critical(0, "dll", "error");
Достаточно даже new QMenu() сделать, чтобы упало. Т.е. любой элемент тянущийся к графике Qt.
Записан
Bepec
Гость
« Ответ #11 : Январь 10, 2012, 08:51 »

А ты случаем, не из dll ки пытаешься вызвать окно GUI?

Записан
QuAzI
Гость
« Ответ #12 : Январь 11, 2012, 09:22 »

Случаем из. Ведь тема про DLL.
Решение траблы примерно такое:
Берём qmfcapp.h и qmfcapp.cpp из Qt Solutions
Код:
BOOL WINAPI DllMain(  HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved  ) {
  if (fdwReason==DLL_PROCESS_ATTACH)
     ownApp = QMfcApp::pluginInstance(hinstDLL);
  } else
  if (fdwReason==DLL_PROCESS_DETACH)
  {
     if (ownApp)
         delete qApp;
  }
  return TRUE;
}
И потом при вызове графики, точнее перед созданием GUI-класса сначала QMfcApp::enterModalLoop() , а потом после уничтожения QMfcApp::exitModalLoop().
Записан
QuAzI
Гость
« Ответ #13 : Январь 13, 2012, 12:29 »

Долбанный QMfcApp натыкал палок в колёс, несколько дней не мог понять, что происходит.
Нифига оно не успевает синхронизироваться с собственным eventFilter, после пары отображений QMenu процесс вешался. Натыкал для отладки в каждую строчку по qDebug() перенаправленный в файл, чем получил кучу мелких задержек которых вдруг хватило чтобы на конкретно моей машине оно успевало отработать.

Осталось ещё понять, почему в приложении офиса например выдаёт по 4 раза событие WM_KEYUP и покурить талмуды на тему, как правильно отвязаться от всех процессов. Т.к. хук автоматически подгружает библиотеку в каждый словленный процесс, много возни с отключением этих бубнов даже чтобы просто перекомпилять библиотеку во время отладки.
Если кто будет с хуками ковыряться, нашёл несколько полезных статеек
http://www.rsdn.ru/article/baseserv/hookdll.xml
http://www.rsdn.ru/article/baseserv/HookTools.xml
Там правда вылез вопрос с тем что MinGW не умеет #pragma, но вроде уже показали где что поправить
« Последнее редактирование: Январь 13, 2012, 12:42 от QuAzI » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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