Russian Qt Forum

Qt => Общие вопросы => Тема начата: Day от Декабрь 17, 2018, 18:41



Название: Взаимодействие приложений
Отправлено: Day от Декабрь 17, 2018, 18:41
 Есть проект, сделанный на Borland-OWL. Последний есть тоненькая обертка над WinAPI, что бы не говорили его создатели. Конечно, он уже мне смертельно надоел, и я лелею мысль потихоньку перевести его на Qt. Сейчас это выглядит так. W-программа(основная) вызывает через CreateProcess Кутэшную часть, которая реализует некоторые диалоги и возвращает управление основной. С этим мне удалось вроде разобраться, хотя трудности были.
 Теперь на очереди поручение Qt-части составления некоторых отчетиков и встраивание их в основную программу. Основная представляет из себя MDI-приложение. То есть надо, чтобы Qt-программа создавала окно и встраивала его (просила встроить) в основную как MDI-Child. Соответственно, перерисовывая его по требованию.
 Вот какими механизмами при этом можно воспользоваться - и есть вопрос.
 Обе части знают хендлы окон друг дружки и умеют посылать им PostMessage


Название: Re: Взаимодействие приложений
Отправлено: Racheengel от Декабрь 18, 2018, 13:47
Qt Windows Migration Framework есть, правда уже старое оно, но может помочь иногда.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 18, 2018, 14:40
Очень интересно! Погуглил немного, нашел только на Инглиш. А на раше, наверное, нет... Впрочем, не беда. Гугл-переводчик вполне приличен. Да и словарь можно по такому случаю в зубы взять:)
Но вот не нашел, где эту радость можно скачать...


Название: Re: Взаимодействие приложений
Отправлено: Racheengel от Декабрь 18, 2018, 19:08
https://github.com/kbinani/qt-solutions/tree/master/qtwinmigrate


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 18, 2018, 21:40
Огромное спасибо!


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 22, 2018, 12:34
 Итак, выбран путь - через DLL (или плагины, имхо, разница невелика)
 Но перед тем как приступить к экспериментам и реализации, хотелось бы проконсультироваться, насколько правильно я понимаю механизмы.
 Вот, есть W-приложение. Оно вызывает функцию из DLL, сделанной на Qt. Параметр вызова - char-строка, содержащая все что нужно. (скажем, имя файла)
 DLL-Qt функция создает окно (скажем, QTextEdit (readonly)) и возвращает его HWND вызвавшему приложению.
 Вопросы.
 DLL-Qt не должно содержать ни QApplication, ни exec(). Но надо ли в pro-файле говорить "QT -= gui" ?
 И конечно, никаких activate(), show() ...?
 У созданного окна должна быть функция обработки событий (сообщений по виндовски). Изменения размеров, перерисовки, скроллирования и т.п. Где она живет? Видимо, в этой DLL-Qt?
 И W-приложение все события, относящиеся к этому окну, отсылает к этой функции. Так?
 Когда сел писать этот пост, вопросов была туча. Но вот они свелись к такому облачку... :)


Название: Re: Взаимодействие приложений
Отправлено: kuzulis от Декабрь 22, 2018, 13:33
это еще больший гемморой. продолжай писать на Borland-OWL или переписывай с нуля на Qt.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 22, 2018, 13:44
это еще больший гемморой. продолжай писать на Borland-OWL или переписывай с нуля на Qt.
За совет - спасибо. :)


Название: Re: Взаимодействие приложений
Отправлено: ViTech от Декабрь 22, 2018, 13:46
это еще больший гемморой. продолжай писать на Borland-OWL или переписывай с нуля на Qt.
Пожалуй соглашусь.

DLL-Qt функция создает окно (скажем, QTextEdit (readonly)) и возвращает его HWND вызвавшему приложению.

Не факт. Посмотрите какой-нибудь утилиткой(например WinSpy), которая показывает Win-окна, на элементы окна WinAPI-приложения и на элементы окна Qt-приложения.

DLL-Qt не должно содержать ни QApplication, ни exec().
Если бы всё так просто было...

Давно это пробовал, теперь уже мало чего помню. Для начала посмотрите Event Loop in Qt-based DLL in a non-Qt application (https://stackoverflow.com/questions/25025168/event-loop-in-qt-based-dll-in-a-non-qt-application) и внимательнее изучите qtwinmigrate (https://github.com/kbinani/qt-solutions/tree/master/qtwinmigrate). Попробуйте для пробы сделать маленькое WinAPI приложение с Qt-виджетами в dll, и оцените, стоит такое же в большое существующее приложение тащить.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 22, 2018, 14:28
Цитировать
и внимательнее изучите qtwinmigrate
Увы! Так и не удалось скачать.
Но остальными вашими советами постараюсь воспользоваться. Спасибо.
Что касаемо гемороя, то имхо, его  в любом случае не избежать. По нулевому пути я уже потоптался.  И стараний не оставляю. Они в любом случае не без пользы. Хотя бы в смысле освоения возможностей. И тут источником гемороя является много факторов и мнений.
На новом же пути бОльшая часть лечения будет зависеть только от меня. Так что попытаться пройти хоть немного по этому пути просто необходимо. Возникнут непреодолимые сложности - ну чтож, сдамся. Не впервой. И вам обязательно об этом доложу, чтобы вы могли потирать руки - "Мы его предупреждали!":)


Название: Re: Взаимодействие приложений
Отправлено: Igors от Декабрь 22, 2018, 18:55
DLL-Qt функция создает окно (скажем, QTextEdit (readonly)) и возвращает его HWND вызвавшему приложению.
 Вопросы.
 DLL-Qt не должно содержать ни QApplication, ни exec(). Но надо ли в pro-файле говорить "QT -= gui" ?
 И конечно, никаких activate(), show() ...?
 У созданного окна должна быть функция обработки событий (сообщений по виндовски). Изменения размеров, перерисовки, скроллирования и т.п. Где она живет? Видимо, в этой DLL-Qt?
 И W-приложение все события, относящиеся к этому окну, отсылает к этой функции. Так?
У меня получалось совсем не так. Конечно Qt dll запускает Qt-приложение и exec - без этого смысла нет. Дело было на Carbon'е (OSX) и мне удалось добиться (кажется с помощью installEventHandler) что если мышь нажата в Qt-окне - вызывается обработчик Qt, иначе - старый обработчик W-приложения. То же и с клавой. Делал ли я на Вындоуз - не помню, я всегда тихо ненавидел эту платформу. Да, и удалось избавиться от dll как таковой, т.е. можно было компилить как одно приложение.

Итак, выбран путь - через DLL (или плагины, имхо, разница невелика)
Разумно, все эти "переписывай с нуля" несерьезны. Но минус "гибрида" очевиден - Вам много придется работать "на аптеку", ну или на сращивание бульдога с носорогом. И этот процесс уже пошел  :)


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 22, 2018, 21:24
Цитировать
я всегда тихо ненавидел эту платформу.
У меня бывали и истерики, и запои. Доходило и до драк. Но, как у зека, который все-таки собирается выжить, пришло смирение.:)
Цитировать
Но минус "гибрида" очевиден
Да. Но назовите мне способ решить даже любую другую задачу, и если он будет без минусов, я пойду за вами на край света:)
Цитировать
Вам много придется работать "на аптеку", ну или на сращивание бульдога с носорогом. И этот процесс уже пошел
Да.Да.Да.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 23, 2018, 21:14
Я бы не стал постить этот пост, если бы не получил по-ходу пару уроков.
Я, не смотря на некоторый опыт, никогда ДЛЛ всерьез не занимался. А тут - пришлось. Как совершенно начинающий начал с ХеллоуВордовского варианта. Со стороны Qt никаких сложностей не было. Сбацали дээлку на ура. А вот с вызовом всего это хозяйства из OWL, да, там были проблемы. Хотя я уже знал ::windows-вариант, но он наводил на меня тоску. Решил воспользоваться возможностями OWL. Про эту библиотеку у меня есть 2 книжки. Клейтон Уолнэм и Том Сван. Первый - пиздобол (прошу прощения), а второй - просто лжец.
И пожалуйста! Все, кто хочет мне добра! Не советуйте что-то продолжать на OWL. Это чудовищно нелепая штука. И я, дурак, за нее зацепился. И отцепиться уже не просто. Лучше бы сразу на WinAPI. Но это тоже не сахар. И в конце XX века я был просто не готов. Да и сейчас не стал бы. Уж больно вся она полна совершеннейших нелепостей. Иногда, пытаясь разобраться с какой-то функцией, хочется поставить ее автора перед собой, и отхлестать его по щекам.
Простите за эмоции, но мы же все немножко программисты...


Название: Re: Взаимодействие приложений
Отправлено: Igors от Декабрь 24, 2018, 10:01
И пожалуйста! Все, кто хочет мне добра! Не советуйте что-то продолжать на OWL. Это чудовищно нелепая штука. И я, дурак, за нее зацепился. И отцепиться уже не просто. Лучше бы ...
Ну и на какой ответ Вы рассчитываете?  "Переписывай с нуля" уже советовали по меньшей мере трижды. Если у Вас хватило ума не пойти по этому пути (и правильно сделали), то большая возня с OWL неизбежна. А значит надо менять отношение к нему, и даже пытаться его как-то "полюбить" (да-да). А чтобы сделать обсуждение более предметным, неплохо бы

- ссылку на исходники/хедеры OWL
- пример типового UI на OWL с обработкой событий и.т.п. Пара страничек кода - вполне достаточно, рабочим этот код быть не обязан

Далее. Чего Вас вообще понесло в dll? Зачем она Вам? Вот есть приложение написанное на бог знает чем - ну и ладно. Можно к нему тупо прицепить Qt либы и хедеры? Конечно можно, наверное Вы уже так и сделали. Ну и дальше разбираться с событийным циклом чтобы он стал "нашим и вашим"



Название: Re: Взаимодействие приложений
Отправлено: Old от Декабрь 24, 2018, 12:03
А значит надо менять отношение к нему, и даже пытаться его как-то "полюбить" (да-да).
Да, Day, полюбите OWL, или он полюбит вас. :)
Потратьте в несколько раз больше времени и сил на скрещивание бульдога с носорогом. Вместо того, что бы взять готовую бизнес логику и реализовать к ней новый GUI.


Название: Re: Взаимодействие приложений
Отправлено: m_ax от Декабрь 24, 2018, 13:11
Цитировать
Вместо того, что бы взять готовую бизнес логику и реализовать к ней новый GUI.
Если, конечно, вся бизнес логика не вшита намертво в GUI :)


Название: Re: Взаимодействие приложений
Отправлено: Old от Декабрь 24, 2018, 13:15
Если, конечно, вся бизнес логика не вшита намертво в GUI :)
Где то в теме, Day писал, что она реализовано отдельно на C.


Название: Re: Взаимодействие приложений
Отправлено: m_ax от Декабрь 24, 2018, 13:19
Если, конечно, вся бизнес логика не вшита намертво в GUI :)
Где то в теме, Day писал, что она реализовано отдельно на C.
Ну тогда вопросов нет)


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 24, 2018, 13:45
Возможно, использование ДЛЛ - не самый лучший путь. Первые проблемы уже появились. Но еще не все пути исчерпаны. Пока проблема в том, что виджеты не хотят создаваться без QApplication. Экспериментирую. Пытаюсь найти в интернете примеры использования Qt-DLL с ГУИ. Пока ничего не нашел. Может быть, напрасно ищу, и такого просто нет в природе?
Подумываю о другой схеме. Параллельный запуск Qt-приложения из W-приложения. И обмен сообщениями. (PostMessage)
Что мне нужно? Чтобы Qt создал виджет и передал его winId в W. Пока все.


Название: Re: Взаимодействие приложений
Отправлено: Igors от Декабрь 24, 2018, 14:29
Подумываю о другой схеме. Параллельный запуск Qt-приложения из W-приложения. И обмен сообщениями. (PostMessage)
Ой нет
Что мне нужно? Чтобы Qt создал виджет и передал его winId в W. Пока все.
И что потом делать с этим HWND? Работать с ним средствами OWL - это вообще не годится (смысла в Qt никакого). Думаю надо стремится к такой схеме:

- заменить текущий событийный цикл на Qt-шный, т.е. QApplication::exec(), без этого вообще дороги нет. "Новые" окна будут работать. Теперь главное - обеспечить работоспособность злополучных "старых" (OWL) окон. "В принципе" это выглядит очень просто - нужно чтобы вызывалась ихняя WndProc. Так или иначе обработчик Qt получит событие OWL окна. Вот что дальше он будет с ним делать - надо смотреть. Навесить QCoreApplication::installNativeEventFilter, если туда придет упр-е - уже хорошо.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 24, 2018, 14:38
Цитировать
И что потом делать с этим HWND? Работать с ним средствами OWL - это вообще не годится (смысла в Qt никакого).
Смысл в том, что средствами Qt можно сделать очень красиво. HTML, шрифты, раскраска, таблицы... И просто, и естественно...


Название: Re: Взаимодействие приложений
Отправлено: Igors от Декабрь 24, 2018, 14:53
Цитировать
И что потом делать с этим HWND? Работать с ним средствами OWL - это вообще не годится (смысла в Qt никакого).
Смысл в том, что средствами Qt можно сделать очень красиво. HTML, шрифты, раскраска, таблицы... И просто, и естественно...
Так эти красоты должны по меньшей мере рисоваться - а для этого нужны Qt события.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 24, 2018, 16:23
Цитировать
а для этого нужны Qt события.
Это понятно. Вот я и пытаюсь скрестить ужа с ежом:)
Какие были мои предположения. Вот Dll-Qt создает окно. Вместе с ним оно должно создать (указать адрес в структуре окна) его функцию. И вот в эту функции и должны как-то попадать сообщения, касающиеся этого окна. Но пока не попадают. Окно создается, его HWND передается, но никаких видимых эффектов не происходит. Впрочем, пока рано о чем-то говорить, работа только начата и есть куда копать.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 24, 2018, 16:27
Одна из идей. По HWND адрес этой функции можно вытащить. А в OWL (и в WinAPI) можно назначить ее окну.


Название: Re: Взаимодействие приложений
Отправлено: Igors от Декабрь 24, 2018, 17:31
Одна из идей. По HWND адрес этой функции можно вытащить. А в OWL (и в WinAPI) можно назначить ее окну.
Насколько я понял, сейчас Вы хотите вживить Qt окно в OWL приложение. Думаю правильно наоборот, сразу "взять быка за рога" и сделать приложение Qt-шным, т.е. запустить QApplication::exec, и в Qt-шный цикл событий "инжектировать" события старых окон.

И забудьте Вы это плохое слово "dll". С наглой мордой объявляете в main QApplication и после создания OWL окна (окон) вызываете exec.  Ну можно какое-нибудь Qt окно добавить для теста.


Название: Re: Взаимодействие приложений
Отправлено: Day от Декабрь 24, 2018, 19:05
Цитировать
С наглой мордой объявляете в main QApplication и после создания OWL окна (окон) вызываете exec.
Наглость-то на своей морде нарисовать сумею (если, конечно, существующей не хватает:)
Но вот как мне создавать OWL-окна в Qt-приложении, ума не приложу. Даже как-то и не думал в этом направлении, и с какого конца подойти не знаю...


Название: Re: Взаимодействие приложений
Отправлено: Igors от Декабрь 25, 2018, 10:12
Но вот как мне создавать OWL-окна в Qt-приложении, ума не приложу. Даже как-то и не думал в этом направлении, и с какого конца подойти не знаю...
OWL окна создаете так же как и сейчас, нужно только выключить событийный цикл OWL. Все равно дело сведется к WinAPI вызову CreateWindow или подобному. В конце-концов вызов ф-ций WinAPI из Qt приложения не запрещен.