![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при использовании dll в качестве plugina
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. По нажатию на кнопку созданную procedureAddButton(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]
Пока ничего! Ищу.