Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Проблема при использовании 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. По нажатию на кнопку созданную procedure AddButton(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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.037 c
1-1117918546
Pasha L
2005-06-05 00:55
2005.06.29
findFirst и findNext


1-1117721563
Erik1
2005-06-02 18:12
2005.06.29
Как записать указатель на процедуру в масв?


1-1117687311
KillerToxa
2005-06-02 08:41
2005.06.29
TRichEdit - выдиление жирным


5-1087794979
Adis
2004-06-21 09:16
2005.06.29
Ресурс


3-1116408719
_e_u_
2005-05-18 13:31
2005.06.29
Вредный, простой скуэль запрос: