Russian Qt Forum

Qt => Общие вопросы => Тема начата: QuAzI от Январь 08, 2012, 03:04



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


Название: Re: Отладка DLL с хуком
Отправлено: Bepec от Январь 08, 2012, 05:15
Организуй простой вывод в лог к примеру. Насколько я помню, QDebug выводит данные в консоль по умолчанию, если не переопределено, а консоль у дллки ты видимо фиг откроешь. :)


Название: Re: Отладка DLL с хуком
Отправлено: merke от Январь 08, 2012, 06:19
Отлаживать библиотеки очень тяжело, я в основном использую в графических приложениях месагбоксы, я в консольных логирование. Если библиотека срет в консоль, то её вывод должен отображаться в консоли родительского приложения. Насчет взаимодействия я посоветую использовать СИГНАЛЫ и СЛОТЫ.


Название: Re: Отладка DLL с хуком
Отправлено: QuAzI от Январь 08, 2012, 18:33
Ну, вроде в файл всё ложится нормально, а вот как в винде между разными приложениями сигналы/слоты Qt выглядят я немного плохо представляю. В экземпл никто не потычет?


Название: Re: Отладка DLL с хуком
Отправлено: merke от Январь 08, 2012, 18:36
Между разными не получится, хотя где то видел подобную реализацию здесь на форуме. Тебе нужно следующее если у тебя приложение в которое ты подключаешь библиотеки на Qt да и сами либы написаны тоже на Qt то подобное ты сможешь реализовать легко, главное наследоваться от QObject


Название: Re: Отладка DLL с хуком
Отправлено: merke от Январь 08, 2012, 18:42
Что то типо этого

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

А в либе делаешь простой публичный слот, в него будешь передавать данные из основного приложения, и сигнал, его будешь испускать и ловить в главном приложении


Название: Re: Отладка DLL с хуком
Отправлено: QuAzI от Январь 09, 2012, 14:37
А в либе публичный слот зачем? Мне надо что-то из куха возвращать. Словил нужное событие - передал приложению. В общем всё равно плохо догоняю, во что на винде сигналы/слоты транслируются. Думаю, стоит запилить нужный функционал в самой либе и не маяться.


Название: Re: Отладка DLL с хуком
Отправлено: mutineer от Январь 09, 2012, 14:53
В общем всё равно плохо догоняю, во что на винде сигналы/слоты транслируются.

Транслируются в вызовы методов-слотов или в передачу QEvent в QEventLoop с последующим вызовом метода-слота


Название: Re: Отладка DLL с хуком
Отправлено: QuAzI от Январь 09, 2012, 17:09
В общем сделал всё нужное в либе, осталось только выводить поверх чужого приложения меню с вариантами выбора действия. Но ни меню, ни даже сообщение QMessageBox::critical(0, "dll", "error"); не могу вывести, текущее приложение сразу падает (при этом моё приложение из которого крутится DLL продолжает работать и валить окна, где срабатывает хук).


Название: Re: Отладка DLL с хуком
Отправлено: Igors от Январь 09, 2012, 18:32
Может это и "не тот случай" но если речь о Вындоуз, то оба (exe и dll) должны быть скомпилены однообразно: напр exe как Multithreaded DLL - значит и dll так же. Если используется STL то дефайны для них должны быть теми же и.т.д.


Название: Re: Отладка DLL с хуком
Отправлено: QuAzI от Январь 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.


Название: Re: Отладка DLL с хуком
Отправлено: Bepec от Январь 10, 2012, 08:51
А ты случаем, не из dll ки пытаешься вызвать окно GUI?



Название: Re: Отладка DLL с хуком
Отправлено: QuAzI от Январь 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().


Название: Re: Отладка DLL с хуком
Отправлено: QuAzI от Январь 13, 2012, 12:29
Долбанный QMfcApp натыкал палок в колёс, несколько дней не мог понять, что происходит.
Нифига оно не успевает синхронизироваться с собственным eventFilter, после пары отображений QMenu процесс вешался. Натыкал для отладки в каждую строчку по qDebug() перенаправленный в файл (http://www.prog.org.ru/index.php?topic=14673.msg96196#msg96196), чем получил кучу мелких задержек которых вдруг хватило чтобы на конкретно моей машине оно успевало отработать.

Осталось ещё понять, почему в приложении офиса например выдаёт по 4 раза событие WM_KEYUP и покурить талмуды на тему, как правильно отвязаться от всех процессов. Т.к. хук автоматически подгружает библиотеку в каждый словленный процесс, много возни с отключением этих бубнов даже чтобы просто перекомпилять библиотеку во время отладки.
Если кто будет с хуками ковыряться, нашёл несколько полезных статеек
http://www.rsdn.ru/article/baseserv/hookdll.xml
http://www.rsdn.ru/article/baseserv/HookTools.xml
Там правда вылез вопрос с тем что MinGW не умеет #pragma, но вроде уже показали (http://www.prog.org.ru/topic_20589_0.html;topicseen) где что поправить