Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизПроблема при использовании dll в качестве plugina Найти похожие ветки
← →
Profi © (2005-06-02 22:50) [0]Делаю программу с поддержкой 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;
← →
Sergey Masloff (2005-06-02 22:53) [1]Да, интересный код. Первые 2 строки после Begin...
← →
Profi © (2005-06-02 22:57) [2]Sergey Masloff (02.06.05 22:53) [1]
Все просто. Я создаю внутри dll панель и присваиваю ей указатель на панель на главной форме. Я могу с ней делать все: менять цвет, caption, размер. А вот кнопку добавить не могу.
← →
Sergey Masloff (2005-06-02 23:03) [3]Поясню.
>Panel1:=Tpanel.create(nil);
Аллоцировали память, создали в ней экземпляр компонента и указатель в Panel1 указывает на этот объект
>Panel1:=Tpanel(MainForm.FindComponent("Panel");
Присвоили указателю другое значение. Память с созданым предыдущей строкой объектом вы потеряли навсегда. Неужели это непонятно?
Рекомендую еще следующий эксперимент. Написать
if (MainForm.FindComponent("Panel") is TPanel) then
someVar = True
else
someVar = False;
И проследить значение переменной SomeVar.
← →
Profi © (2005-06-02 23:07) [4]Sergey Masloff (02.06.05 23:03) [3]
Он будет true.
← →
Sergey Masloff (2005-06-02 23:09) [5]Profi © (02.06.05 23:07) [4]
>Он будет true.
Рекомендую проверить. Осмелюсь предположить что True он не будет.
← →
Eraser © (2005-06-02 23:11) [6]Profi © (02.06.05 22:57) [2]
Рекомендуется почитать про объектно-ориентированное программирование.
← →
Profi © (2005-06-02 23:11) [7]Sergey Masloff (02.06.05 23:09) [5]
Согласен. Да и первую строку можно убрать. Но ведь цвет и все остальное могу менят.
← →
Profi © (2005-06-02 23:13) [8]Eraser © (02.06.05 23:11) [6]
Кинь ссылку, где конкретно про это написанно, а то не могу найти. Все книжки про delphi про ООП говорят только бла-бла-бла.
← →
Юрий Зотов © (2005-06-02 23:13) [9]> Profi © (02.06.05 23:07) [4]
Если проекты Exe и DLL не компилировались с run-time пакетами (причем оба), то SomeVar всегда будет False.
← →
Profi © (2005-06-02 23:15) [10]Юрий Зотов © (02.06.05 23:13) [9]
Уже убедился. Но все-таки можно простой пример, как добавить кнопку. Дальше наверно смогу сам.
← →
Eraser © (2005-06-02 23:15) [11]Profi ©
Возможно тут найдёшь http://www.podgoretsky.com/ - инфы на сайте много, но надо искать...
← →
Profi © (2005-06-02 23:22) [12]Eraser © (02.06.05 23:15) [11]
Пока ничего! Ищу.
← →
Sergey Masloff (2005-06-02 23:25) [13]Profi © (02.06.05 23:11) [7]
>Но ведь цвет и все остальное могу менят
Ну и что. TPanel в dll и TPanel в аппликации это не одно и то же (если они не скомпилированы с использованием runtime пакетов). Хотя конечно они одинаковые и когда мы обращаемся к свойству панели в DLL по указателю полученному от приложения мы попадаем на нужное смещение для вызова функций. Но вот приведение типов с ними делать нельзя потому что это РАЗНЫЕ типы
← →
Sergey Masloff (2005-06-02 23:26) [14]Юрий Зотов © (02.06.05 23:13) [9]
Только хотел дать более-менее развернутый ответ ;-)
и не успел ;-)
← →
Eraser © (2005-06-02 23:29) [15]Profi © (02.06.05 23:22) [12]
Там как-то хитро сделан поиск )
Лучше спросить у самого АП - есть там или нету нужной книги.
А вообще по этой теме в сети очень много литературы.
По сабжу. Делать плагины не так просто как может показаться. Например есть ряд проблем с передачей динамических объектов (строк например). Скоро столкнёшься.
← →
Profi © (2005-06-02 23:35) [16]Eraser © (02.06.05 23:29) [15]
Со строками уже намучился. С ними более-менее (больше менее) разобрался. А вот с АП у нас плохие отношения. Так что буду искать через Яндекс.
← →
Alexander Panov © (2005-06-02 23:38) [17]Profi © (02.06.05 23:35) [16]
А вот с АП у нас плохие отношения
1. В смысле?
2. А что такое плагин? Задай себе вопрос.
← →
Eraser © (2005-06-02 23:38) [18]Profi © (02.06.05 23:35) [16]
В JEDI VCL есть какая-то технология для поддержки плагинов... не знаю то это или нет, но имей ввиду, может уже есть то что надо.
← →
Profi © (2005-06-02 23:41) [19]Alexander Panov © (02.06.05 23:38) [17]
1. В прямом: он считает меня полным ламером, я его заносчивым и самолюбивым.
2. Дополнительный, динамически подключаемый, модуль для расширения функциональности программы.
← →
Eraser © (2005-06-02 23:43) [20]Profi © (02.06.05 23:41) [19]
1. В прямом: он считает меня полным ламером, я его заносчивым и самолюбивым.
2. Дополнительный, динамически подключаемый, модуль для расширения функциональности программы.
Ну тут всё относительно... )
Все программеры считают кого-то полными ламерами.
Все люди отчасти заносчивы и самолюбивы ))
← →
Profi © (2005-06-02 23:48) [21]Eraser © (02.06.05 23:43) [20]
Отклоняемся от темы. Мне бы с plugin"ами разобраться.
← →
Alexander Panov © (2005-06-02 23:50) [22]Profi © (02.06.05 23:41) [19]
1. В прямом: он считает меня полным ламером, я его заносчивым и самолюбивым.
Кто он?
Profi © (02.06.05 23:41) [19]
2. Дополнительный, динамически подключаемый, модуль для расширения функциональности программы.
Однажды я себе задал такой вопрос. А также знакомым программистам.
Оказалось, что плагин - это просто протокол(список соглашений, функций - как тебе угодно). Стандартного понятия нет.
Так что это дело твоего вкуса и фантазии, как реализовать подключаемые модули. Но рекомендации, конечно, не мешает послушать никогда.
← →
Profi © (2005-06-02 23:53) [23]Alexander Panov © (02.06.05 23:50) [22]
Кто он?
АП
Но рекомендации, конечно, не мешает послушать никогда.
Так мне и нужна рекомендация: что почитать или ма-а-аленький примерчик. Я же не прошу за меня весь код писать.
← →
Eraser © (2005-06-02 23:56) [24]Profi © (02.06.05 23:53) [23]
Ма-а-а-а-аленький примерчик есть в JEDI VCL я же писал по-моему...!
← →
Profi © (2005-06-03 00:05) [25]Eraser © (02.06.05 23:56) [24]
Там 13 мегов!!! Я с DialUp"ом его сутки качать буду!
← →
Юрий Зотов © (2005-06-03 00:06) [26]> Profi © (02.06.05 23:53) [23]
Вот общая схема.
1. В плагине (DLL) реализован некий заранее известный интерфейс и экспортирована функция с заранее известным именем, возвращающая ссылку на этот интерфейс.
2. Программма грузит плагин, вызывает эту функцию и получает ссылку на интерфейс.
3. Далее, когда программе нужно сделать что-то, за что отвечает плагин, она вызывает соответствующий метод интерфейса. Как это будет сделано конкретно - ее не интересует. Таким образом, разные плагины могут реализовывать, например, разный внешний вид программы.
← →
Profi © (2005-06-03 00:10) [27]Юрий Зотов © (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:29) [28]> 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:32) [29]Юрий Зотов © (03.06.05 0:29) [28]
Спасибо за помощь, буду думать и, если надумаю, делать.
← →
Германн © (2005-06-03 02:35) [30]<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 минуты ответил Александр П. Они, конечно, разные. Но похоже нам скоро придется установить некие стандарты, чтобы безошибочно определять, кто такой АП.
← →
Просто Джо © (2005-06-03 04:31) [31]2 Profi
Ищи статью Тенцера "Delphi и COM" (была где-то на сайте у АП, кажется). Там весьма аппетитные примеры использования интерфейсов для создания плагинов. Очень хорошо изложено.
П.С. АП - Анатолий Подгорецкий, а не Александр П. :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.057 c