![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Akella |
|
||||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
Есть программа, которая при загрузке выполняет поиск и загрузку DLL.
При загруке Dll добавляет пункт меню и вешает обработчик. Т.е. можно как-то вызвать средствами dll какую-либо форму главной программы или какую-либо процедуру/функцию главной программы. Вопрос в том, как? Вот этот код выполняет загрузку DLL
Код DLL
|
||||
|
|||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 2 Всего: 260 |
Akella, никак. забей. много проблем - и ничего толком. чтоб изменить пункт меню формы, надо в интерфейсе ДЛЛ при проектировании заложить функцию, и при вызове в неё передавать указать на объект типа TForm. И функция добавить пункт меню. Но! Это вызывает две проблемы:
1. проблема размера: чтоб знать про существование класса TForm каждая DLL должна нести в своем бинарном коде описание структуры класса. Сколько плагинов - на столько раз * размер класса TFrom будет увеличено занимаемое дисковое пространство и память. 2. проблема адреса. Тут была проблемная тема на форуме: человек передавал в DLL объект класса TImage. DLL принимала. А TImage - это вообще контейнер-оболочка, сама картинка хранится в свойстве Picture. Так вот, класс этого свойства TPicture в адресном пространстве приложения и Dll отличались, т.е. считались разными. И dll по получению объекта TImage со спокойной совестью "сносила" объект Picture некорректного класса и создавала его заново. Прикольно? Картинка пришла - и очистилась Выяснили причину такого поведения после нескольких десятков сообщений Ну,как, напугал? Выход есть. Называется он - bpl. Т.е. пакетная библиотека Найду пример использования, скину. Добавлено @ 16:10 1. вот кратенько про DLL vs BPL и пример реализации простых плагинов на пакетах. 2. вот намного более углубленное сравнение, но и примеры - слишком замысловатые. |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 2 Всего: 260 |
вот тут шел спор о том, что и как реализовано в механизме dll:
Проблемма с переменными в DLL. А здесь Alexis сказал про разные классы, что с экспортом/импортом объектов в/из dll будет сплошь головная боль.
А вот и сама тема: Приложене и DLL особенности их взаимодействия, Неверно функционируют компоненты . Правда, я попутал: Alexis в перевом же посте указал не только на проблему, но и на причину. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
1 вариант: создать в приложении какой-то менеджер, который будет принимать сообщения и выполнять их как комманды.
2 вариант: работать через интерфейсы. Примеров не дам - на работе завал |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Akella, можно в приложении написать набор из нескольких функций, которые будут производить все необходимые операции, а при загрузке плагина передать их адреса в Dll. Т.о. все будет производиться на стороне приложения.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
неплохая статья с примерами: http://delphiworld.narod.ru/base/about_com.html и еще одна: http://delphiworld.narod.ru/base/delphi_com.html Это сообщение отредактировал(а) MetalFan - 13.3.2007, 17:35 -------------------- There are always someone smarter than you... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
с эти нет проблем, это уже раелизовано Добавлено @ 17:45 нед! Добавлено @ 17:47 если посмотреть на код, то так всё и сделано:
или я ошибся? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
Народ, мне фактически нужно следующее
из приложения (средствами DLL) вызвать функцию этого- же приложения. Допустим Что функция вызывает какую-то форму. Вот. Я вызываю косвенно форму, а из DLL уже манипулирую этой формой. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Akella, вроде не то. Приложение должно вызвать определенную функцию из Dll и передать ей (Dll), адреса своих функций (которые и будут производить все опрации с объектами приложения). В Dll нужно создать глобальные переменные куда можно будет записать эти адреса. Теперь при вызове функции расположенной в Dll, сама Dllка сможет вызвать калбэком функции расположенные в приложении, потому что только они могут безопасно обращаться с объектами приложения. Думаю интерфесы примерно так и работают.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
так и есть!!
вот же, на менюху вешаю код, который "прописан" в DLL-ке. plugExec вызывается из DLL. Вот в DLL что-то нужно написать, что бы при выполнеии кода act.onExecute := plugExec; выполнялась процедура из главного приложения приложение -> act.onExecute := plugExec -> в DLL PlugExec -> вызов какой либо процедуры главного окна приложения Добавлено @ 18:15 не затруднит Вас набросать несколько строк кода, исходя из моего примера, описанного в самом верху странички Добавлено @ 18:26 распечатал инфу со сцилок, дома почитаю, я пока разбираюсь в сути, как лучше реализовать поддержку плагинов в приложении, по идее приложении и не должно знать не про какие плагины, а тупо подгружать DLL-ки. С DLL никогда не работал. А всякие примеры с этими калькуляторами(как будто ничего другого нельзя придумать), которые описаны во всех книгах и так понятны. |
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Вот примерно так
Это будет код программы
А у дллки такой
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
Alexeis, а зачем огород городить, если уже все это гораздо удобнее с пом.COM реализуется? ;)
-------------------- There are always someone smarter than you... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
меня ком не устраивает
|
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
хотя, если чесно, то нужно подумать
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 16 Всего: 128 |
Akella, я тож так думал, что ком ненужная надстройка...
но потом когда в итоге получилось то же, но в 10 раз замудреннее... вернулся на ком-интерфейсы. код стал гораздо прозрачнее -------------------- There are always someone smarter than you... |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |