Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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. По нажатию на кнопку созданную 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.057 c
1-1118066050
N
2005-06-06 17:54
2005.06.29
dxTreeList


6-1111941256
Vitaly Gavrilov
2005-03-27 20:34
2005.06.29
О учете времени в интернет


3-1116234329
Maverick
2005-05-16 13:05
2005.06.29
Передача параметра в ADOStoredProc


1-1118017641
dp200
2005-06-06 04:27
2005.06.29
OpenDialog , открытие нескольких файлов


1-1117622966
Leonid
2005-06-01 14:49
2005.06.29
Запуск DOS-приложения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский