Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема при использовании dll в качестве plugina


Страницы:   1 2

Profi ©   (2005-06-02 22:50:00) 

Делаю программу с поддержкой plugin'ов в виде dll. Экспортирую в dll указатель на главную форму. На форме нахожу панель с именем Panel используя FindComponent. А вот добавить на неё кнопку не могу. Выскакивает ошибка: Exception EconvertError in modul Project1.exe at 0001939C. Как бороться? Код внутри dll:

Var panel1:Tpanel;
Button1:Tbutton;
Begin
Panel1:=Tpanel.create(nil);
Panel1:=Tpanel(MainForm.FindComponent('Panel');
Button1:=Tbutton.create(nil);
Button1.parent:=Panel1;
End;


Просто Джо   (2005-06-03 04:31:00) [1]

2 Profi
Ищи статью Тенцера "Delphi и COM" (была где-то на сайте у АП, кажется). Там весьма аппетитные примеры использования интерфейсов для создания плагинов. Очень хорошо изложено.
П.С. АП - Анатолий Подгорецкий, а не Александр П. :)


Германн   (2005-06-03 02:35:00) [2]

<offtopic>

2 Profi ©   (02.06.05 23:35) [16]
>Eraser ©   (02.06.05 23:29) [15]
>Со строками уже намучился. С ними более-менее (больше менее) >разобрался. А вот с АП у нас плохие отношения. Так что буду >искать через Яндекс.

--------------------------------------------------------------------------------
>Alexander Panov ©   (02.06.05 23:38) [17]
>Profi ©   (02.06.05 23:35) [16]
>А вот с АП у нас плохие отношения

>1. В смысле?

Забавно получилось. :)
На замечание, в котором упомянут был, имхо, Анатолий П. через 3 минуты ответил Александр П. Они, конечно, разные. Но похоже нам скоро придется установить некие стандарты, чтобы безошибочно определять, кто такой АП.


Profi   (2005-06-03 00:32:00) [3]

Юрий Зотов ©   (03.06.05 0:29) [28]
Спасибо за помощь, буду думать и, если надумаю, делать.


Юрий Зотов   (2005-06-03 00:29:00) [4]

> Profi ©   (03.06.05 00:10) [27]

У Вас класс, а не интерфейс. Вообще, вся схема У Вас построена так, что Exe и DLL обмениваются ссылками на экземпляры классов. Так делать можно, но это плохо по трем причинам.

1. Либо Exe и DLL надо компилировать c run-time пакетами одной и той же версией Delphi, либо cм. два следующих пункта.

2. Возникает дублирование кода, часто немалое.

3. Требуется аккуратность и очень хорошее знание особенностей совместного использования общих объектов разными проектами. Рассказать об этих особенностях здесь не представляется возможным - это немало и требует достаточно глубокого знания и понимания устройства VCL, да и вообще ООП-модели Delphi.

=========================================

Сделайте модуль, в котором ТОЛЬКО объявлен интерфейс (именно интерфейс, а не класс). Больше ничего в этом модуле нет. Он используется и программой и плагином, причем реализован интерфейс в плагине, а программа только вызывает его методы.


Profi   (2005-06-03 00:10:00) [5]

Юрий Зотов ©   (03.06.05 0:06) [26]
У меня примерно та же схема:
1. есть интерфейс:
TPluginInterface = class
 public
   function GetMainForm: TForm; stdcall;
   procedure AddButton(Hint: String; Icon:Ticon; Proc: TNotifyEvent); stdcall;
 end;

2. То же есть.
3. По нажатию на кнопку созданную procedure AddButton(Hint: String; Icon:Ticon; Proc: TNotifyEvent); stdcall;вызываю функцию Proc описанную в DLL.


Юрий Зотов   (2005-06-03 00:06:00) [6]

> Profi ©   (02.06.05 23:53) [23]

Вот общая схема.

1. В плагине (DLL) реализован некий заранее известный интерфейс и экспортирована функция с заранее известным именем, возвращающая ссылку на этот интерфейс.

2. Программма грузит плагин, вызывает эту функцию и получает ссылку на интерфейс.

3. Далее, когда программе нужно сделать что-то, за что отвечает плагин, она вызывает соответствующий метод интерфейса. Как это будет сделано конкретно - ее не интересует. Таким образом, разные плагины могут реализовывать, например, разный внешний вид программы.


Profi   (2005-06-03 00:05:00) [7]

Eraser ©   (02.06.05 23:56) [24]
Там 13 мегов!!! Я с DialUp'ом его сутки качать буду!


Eraser   (2005-06-02 23:56:00) [8]

Profi ©   (02.06.05 23:53) [23]

Ма-а-а-а-аленький примерчик есть в JEDI VCL я же писал по-моему...!


Profi   (2005-06-02 23:53:00) [9]

Alexander Panov ©   (02.06.05 23:50) [22]
Кто он?

АП

Но рекомендации, конечно, не мешает послушать никогда.

Так мне и нужна рекомендация: что почитать или ма-а-аленький примерчик. Я же не прошу за меня весь код писать.


Alexander Panov   (2005-06-02 23:50:00) [10]

Profi ©   (02.06.05 23:41) [19]
1. В прямом: он считает меня полным ламером, я его заносчивым и самолюбивым.


Кто он?

Profi ©   (02.06.05 23:41) [19]
2. Дополнительный, динамически подключаемый, модуль для расширения функциональности программы.


Однажды я себе задал такой вопрос. А также знакомым программистам.

Оказалось, что плагин - это просто протокол(список соглашений, функций - как тебе угодно). Стандартного понятия нет.

Так что это дело твоего вкуса и фантазии, как реализовать подключаемые модули. Но рекомендации, конечно, не мешает послушать никогда.


Profi   (2005-06-02 23:48:00) [11]

Eraser ©   (02.06.05 23:43) [20]
Отклоняемся от темы. Мне бы с plugin'ами разобраться.


Eraser   (2005-06-02 23:43:00) [12]

Profi ©   (02.06.05 23:41) [19]
1. В прямом: он считает меня полным ламером, я его заносчивым и самолюбивым.
2. Дополнительный, динамически подключаемый, модуль для расширения функциональности программы.


Ну тут всё относительно... )
Все программеры считают кого-то полными ламерами.
Все люди отчасти заносчивы и самолюбивы ))


Profi   (2005-06-02 23:41:00) [13]

Alexander Panov ©   (02.06.05 23:38) [17]
1. В прямом: он считает меня полным ламером, я его заносчивым и самолюбивым.
2. Дополнительный, динамически подключаемый, модуль для расширения функциональности программы.


Eraser   (2005-06-02 23:38:00) [14]

Profi ©   (02.06.05 23:35) [16]

В JEDI VCL есть какая-то технология для поддержки плагинов... не знаю то это или нет, но имей ввиду, может уже есть то что надо.


Alexander Panov   (2005-06-02 23:38:00) [15]

Profi ©   (02.06.05 23:35) [16]
А вот с АП у нас плохие отношения


1. В смысле?
2. А что такое плагин? Задай себе вопрос.


Profi   (2005-06-02 23:35:00) [16]

Eraser ©   (02.06.05 23:29) [15]
Со строками уже намучился. С ними более-менее (больше менее) разобрался. А вот с АП у нас плохие отношения. Так что буду искать через Яндекс.


Eraser   (2005-06-02 23:29:00) [17]

Profi ©   (02.06.05 23:22) [12]

Там как-то хитро сделан поиск )
Лучше спросить у самого АП - есть там или нету нужной книги.
А вообще по этой теме в сети очень много литературы.

По сабжу. Делать плагины не так просто как может показаться. Например есть ряд проблем с передачей динамических объектов (строк например). Скоро столкнёшься.


Sergey Masloff   (2005-06-02 23:26:00) [18]

Юрий Зотов ©   (02.06.05 23:13) [9]
Только хотел дать более-менее развернутый ответ ;-)
и не успел ;-)


Sergey Masloff   (2005-06-02 23:25:00) [19]

Profi ©   (02.06.05 23:11) [7]
>Но ведь цвет и все остальное могу менят
Ну и что. TPanel в dll и TPanel в аппликации это не одно и то же (если они не скомпилированы с использованием runtime пакетов). Хотя конечно они одинаковые и когда мы обращаемся к свойству панели в DLL по указателю полученному от приложения мы попадаем на нужное смещение для вызова функций. Но вот приведение типов с ними делать нельзя потому что это РАЗНЫЕ типы


Profi   (2005-06-02 23:22:00) [20]

Eraser ©   (02.06.05 23:15) [11]
Пока ничего! Ищу.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо