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