Форум на CrossPlatform.RU _ Qt Общие вопросы _ Делаем как Squish for QT
Автор: alexus_ru 4.2.2009, 23:37
Доброго времени суток У меня очень зловредный вопрос Допустим у нас есть скомпилированный exe прога на c++ под QT мы берем вторую прогу и вызываем методы первой проги. Читаем виджеты первой проги. видим все ее объекты при этом это совершенно обычная программа..без QTScriptEngine или даже ActiveX и мы получаем например все ТекстБоксы и читаем их значения, пользуясь объектной моделью QT Так делает вот эта супер программа - http://www.froglogic.com/pg?id=Home
я никак не могу понять как это сделать( и если в принципе невозможно...то какая технология могла бы быть к этому максимально приближена?
Автор: Litkevich Yuriy 5.2.2009, 0:52
alexus_ru, а свои варианты есть?
П.С. не плоди копии сообщений
Автор: SABROG 5.2.2009, 1:24
Просто догадка. Возможно программа находит указатель qApp (QApplication), а уже через него получает все остальное: QApplication::allWidgets ()
Вторая догадка состоит в том, что программа вешает хуки на основные функции библиотеки Qt. В результате когда программа обращается к функциям Qt на самом деле проходит через прослойку.
Ну или используется какой-нибудь механизм иньекции, что позволяет обращаться к методам Qt от имени самой программы.
Автор: DmP 5.2.2009, 8:18
Цитата(Litkevich Yuriy @ 5.2.2009, 0:52)
Просто догадка. Возможно программа находит указатель qApp (QApplication), а уже через него получает все остальное: QApplication::allWidgets ()
Скорее всего так и есть, на демо-ролике показана, что программу запускает сам Squish, потом он по видимому запускает свой поток в загруженном приложении, определяет версию Qt, потом находит QCoreApplication::self - думаю найти эту переменную в памяти не так сложно, так как она потомок QObject. А все остальное дело техники.
Автор: alexus_ru 5.2.2009, 13:28
Цитата
Скорее всего так и есть, на демо-ролике показана, что программу запускает сам Squish, потом он по видимому запускает свой поток в загруженном приложении, определяет версию Qt, потом находит QCoreApplication::self - думаю найти эту переменную в памяти не так сложно, так как она потомок QObject. А все остальное дело техники.
С техникой QT у меня пока не очень ( Подскажи, пожалуйста, что необходимо изучить, чтобы знать как "запустить свой поток в загруженном приложении", "найти QCoreApplication::self в памяти" я не имею никаких догадок на этот счет.
Автор: DmP 5.2.2009, 14:46
Цитата(alexus_ru @ 5.2.2009, 16:28)
С техникой QT у меня пока не очень (
Это к Qt не имеет ни какого отношения.
Автор: alexus_ru 5.2.2009, 15:37
Цитата(DmP @ 5.2.2009, 14:46)
Это к Qt не имеет ни какого отношения.
Не мог бы подсказать, как это можно сделать?
Автор: DmP 5.2.2009, 16:11
Погугли на тему "внедрение в чужой процесс". Потом обычно в каждой программе QApplication расположен в стеке, когда окажешься в том же процессе, что и нужная программа пройдись по стеку и попробуй найти виртуальную таблицу QApplication, ну это как вариант. Сам такого не делал, точно сказать не могу.
Автор: DmP 5.2.2009, 23:24
Есть еще вариант http://doc.trolltech.com/main-snapshot/accessible.html, возможно это то что нужно.
Автор: SABROG 6.2.2009, 0:44
Цитата(DmP @ 5.2.2009, 23:24)
Есть еще вариант http://doc.trolltech.com/main-snapshot/accessible.html, возможно это то что нужно.
А это случаем не интерфейс для создания приложений для людей с ограниченными способностями?
Автор: alexus_ru 6.2.2009, 1:14
Вообще то интерфейс. Не совсем уверен, что это можно как то применить.
Кстати, то нибудь может подсказать, как определить тип виджета, например полученного методом?
А это случаем не интерфейс для создания приложений для людей с ограниченными способностями?
Я тоже так думал, но не все так просто. Например, http://www.intuit.ru/department/internet/operawebst/26/4.html дается понять, что через эту технологию можно получить доступ к другому приложению, верней к элементам из которых состоит окно.
Цитата(SABROG @ 6.2.2009, 0:44)
Кстати, то нибудь может подсказать, как определить тип виджета, например полученного методом?
QObject::objectName() или QObject::metaObject()->className()