OberonCore
https://forum.oberoncore.ru/

запуск фреймворка в виде DLL
https://forum.oberoncore.ru/viewtopic.php?f=2&t=3525
Страница 1 из 1

Автор:  Пётр Кушнир [ Среда, 03 Август, 2011 00:11 ]
Заголовок сообщения:  запуск фреймворка в виде DLL

предпринял тут попытку написать плагин для одной известной программы.
сам плагин должен быть реализован на основе СОМ интерфейсов. с этим, после небольшого погружения, проблем нет.
потом мне захотелось, чтобы и остальную часть работы выполнял плагин, и поэтому я придумал превратить ББ в dll
выбрал минимально необходимый набор кодовых файлов, собрал либу, воткнул в Packed-файлы всякие ресурсы, даже скрыл главное окно ББ, затем подключил к целевой программе стандартным образом.
и тут возникла трудность - дело в том, что вызов HostMenus.Run -> Kernel.Start(Loop) -> Loop не имеет выхода, то есть, он крутится до того момента, пока не придёт сообщение о закрытии от винды (WM_CLOSE кажется). а целевое приложение видимо - однопоточное и поэтому процесс его загрузки останавливается в тот момент, когда начинает работать ББ.

вопрос: как можно обойти это ограничение, притом что изменить целевую программу нет никакой возможности?

Автор:  Александр Ильин [ Среда, 03 Август, 2011 09:35 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Встречный вопрос: а HostMenus.Run вообще нужен? Плагин содержит GUI, сделанный средствами ББ?

Автор:  Пётр Кушнир [ Среда, 03 Август, 2011 09:41 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

кроме гуя там ещё отложенные действия крутятся, и всё такое

Автор:  Александр Ильин [ Среда, 03 Август, 2011 10:04 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Самым простым путём видится запуск ББ в отдельном фоновом процессе (либо в параллельной нити в пределах родительского процесса), а общаться с ним - посредством виндовой очереди сообщений.

Автор:  Пётр Кушнир [ Среда, 03 Август, 2011 11:39 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

как-то это натужно.
с таким же успехом можно применить любой другой ЯП, получится без фреймворка правда, вот основное горе)

Автор:  Евгений Темиргалеев [ Среда, 03 Август, 2011 12:00 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Пётр Кушнир писал(а):
кроме гуя там ещё отложенные действия крутятся, и всё такое
Отложенные действия можно крутить самому: viewtopic.php?f=35&t=3429

Если гуй запускается время от времени, типа окон настроек, то, наверное, можно переделать Loop на ручной пуск:
- открытие окна и вызов Loop
- по "закрытии" -- окно ставит специальный флаг и Loop останавливается.

Автор:  Александр Ильин [ Среда, 03 Август, 2011 13:11 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Пётр Кушнир писал(а):
как-то это натужно
Ну, перепишите HostMenus.Loop, если вам это менее натужно.

Автор:  Info21 [ Четверг, 04 Август, 2011 15:14 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

А забавно, ББ в виде DLL.
Можно, наверное, делать внешние интерфейсы под конкретные приложения -- и давать людЯм крутить из любимых сред. Пусть втягиваются :)

Автор:  Иван Кузьмицкий [ Четверг, 04 Август, 2011 21:06 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Info21 писал(а):
А забавно, ББ в виде DLL.
Можно, наверное, делать внешние интерфейсы под конкретные приложения -- и давать людЯм крутить из любимых сред. Пусть втягиваются :)


Да, вот в этой теме как раз идёт речь про популярную карту Дубль-ГИС: 2gis.ru

Автор:  Valery Solovey [ Четверг, 04 Август, 2011 23:51 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Пётр Кушнир писал(а):
вопрос: как можно обойти это ограничение, притом что изменить целевую программу нет никакой возможности?
Не уверен, что понимаю проблему целиком, но всё же...

А что, если написать плагин к программе не на ББ, а на другом языке? Скажем, Си или Объектный Паскаль? Работа плагина будет заключаться в запуске потока, в котором будет запущен ББ. Такое возможно?

Автор:  Евгений Темиргалеев [ Пятница, 05 Август, 2011 08:28 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Valery Solovey писал(а):
А что, если написать плагин к программе не на ББ, а на другом языке? ... Работа плагина будет заключаться в запуске потока, в котором будет запущен ББ. Такое возможно?
Такое возможно и на ББ.

Автор:  Пётр Кушнир [ Пятница, 05 Август, 2011 11:33 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

вся проблема в том, что интерфейс взаимодействия дгис с плагинами довольно внушительный, и, так или иначе если ББ будет не-плагином, то придётся все эти интерфейсы перенаправлять в ББ через виндовую шину, или ещё как-то.
а с ББ-плагином реализация этих интерфейсов будет работать напрямую с ББ.
технически, там COM интерфейсы, по идее, их можно как в виде dll реализовать, так и оформить в виде COM-сервера на стороне ББ.
но у меня не получилось, да и это отдельная тема.

Автор:  Иван Денисов [ Пятница, 05 Август, 2011 19:46 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Чем вам не понравилось предложение Евгения? Модифицируйте Loop в HostMenus и собирайте спокойно все в dll. В нем же можно убрать открытие главного окна, если я правильно понял. При вызове функции запускаете петлю, как все выполнится, останавливайте петлю. Например, в секции CLOSE присвоить
Код:
HostMenus.stop := TRUE;
А в петле условие будет выглядеть так
Код:
WHILE (WinApi.GetMessageW(msg, 0, 0, 0) # 0) &  ~ stop DO
Сам не пробовал, сразу говорю, но из опыта ручного кручения Loop -- это должно сработать.

Евгений Темиргалеев писал(а):
Пётр Кушнир писал(а):
кроме гуя там ещё отложенные действия крутятся, и всё такое
Отложенные действия можно крутить самому: viewtopic.php?f=35&t=3429

Если гуй запускается время от времени, типа окон настроек, то, наверное, можно переделать Loop на ручной пуск:
- открытие окна и вызов Loop
- по "закрытии" -- окно ставит специальный флаг и Loop останавливается.

Автор:  Пётр Кушнир [ Пятница, 05 Август, 2011 20:42 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

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

Автор:  Иван Денисов [ Пятница, 05 Август, 2011 23:00 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Пётр Кушнир писал(а):
любое переписывание влечёт за собой сопровождение, отрыв от основной ветки разработки.
перепишу я сейчас хост, и потом постоянно буду его переписывать, при любом изменении со стороны оминков.
оно мне надо?
Если охото использовать достоинства ББ, то, видимо, придется лезть в каркас. Был такой опыт, собирал библиотеку с подсистемой SQL, хоть там и без Actions, но пришлось в каркасе комментить строку.

Автор:  Axcel [ Суббота, 06 Август, 2011 14:14 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Пётр Кушнир писал(а):
...
перепишу я сейчас хост, и потом постоянно буду его переписывать, при любом изменении со стороны оминков.
оно мне надо?

Со стороны омников изменения так редки, что ...

Автор:  Info21 [ Суббота, 06 Август, 2011 20:40 ]
Заголовок сообщения:  Re: запуск фреймворка в виде DLL

Axcel писал(а):
Пётр Кушнир писал(а):
... перепишу я сейчас хост, и потом постоянно буду его переписывать, при любом изменении со стороны оминков.
оно мне надо?
Со стороны омников изменения так редки, что ...
Более того, Оминк подчеркивали, что стабильность ББ -- одно из самых высокоценимых пользователями его качеств.

Для сравнения вспоминаю, как ушел коту под хвост замечательный набор макросов, сделанный в 1993 г. для MS Word.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/