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

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

DLL или BPL [D7]


Страницы:   1 2

REA ©   (2003-01-23 10:57:00) 

Думаю как лучше сделать плугины. Я всегда делал DLL и вот решаю - надо ли мне использовать packages вместо этого. Если кто делал - поскажите ошутимые преимущества. Больше всего конечно мне не нравится, что у них (DLL и EXE) разные RTTI и классы не проверить на тип и не передать из одного в другое - при попытках присвоения визуальным элементам несовпадение типов.


REA   (2003-01-27 11:51:00) [1]

2asmith: У меня в принципе с 96 года plugin manger по такому принципу сделан, но только еще хитрее - он грузит группы плагинов и в качестве параметра получает указатель на метакласс враппера плагина. Получается на выходе группа классов со всеми функциями код которых в DLL.

2Игорь Шевченко: Tnanx, забыл я дурак, щас попробую.


Игорь Шевченко   (2003-01-27 11:46:00) [2]

REA © (25.01.03 12:32)

Есть. EXEшник должен быть скомпилирован с использованием пакета vclxx.bpl


asmith   (2003-01-25 15:36:00) [3]

COM дает возможность использовать одну вещь, которая очень полезна при мспользовании подгружаемых модулей. Имя ей - COM Component Categories. В двух словах это означает, что можно группировать подгружаемые модули в некие категории компонентов и есть возможность в любой момент узнать, какие модули принадлежат той или иной группе. Простой пример-одна группа модулей расширяет функциональность меню "View" моей программы, вторая-меню "Edit". Часть модулей регистрирую в одной категории, часть в другой. При загрузке программы запрашиваю сначала первую категорию, встраиваю в первое меню, затем вторую... Написал новый модуль, зарегистрировал в нужной категории и все - встроится автоматом, где требуется.
ЗЫ. Реализуется эта кухня на удивление просто.


REA   (2003-01-25 12:56:00) [4]

Хм. Может статически BPL подключил?
Лениво COM прецеплять и непонятно что это даст. А если интерфейсы без COM то тем более непонятно что даст.


Mystic   (2003-01-25 12:49:00) [5]

У меня этот код работает (на форме появляется новая кнопка).
Что я сделал не так?

Я бы реализовывал все через интерфейсы, наподобие OpenToolsAPI. Имхо удобнее.


REA   (2003-01-25 12:32:00) [6]

2Игорь Шевченко:
Ау. Есть возражения, замечания, грязные ругательства?


REA   (2003-01-24 16:23:00) [7]

Вот проверил:
Exe:

TTestProc = Procedure(Parent: TWinControl);

procedure TForm1.Button1Click(Sender: TObject);
begin
TTestProc(GetProcAddress(LoadPackage(ExtractFilePath(Application.ExeName)+"test.bpl"),
"test"))(Self);
end;

BPL:
Procedure test(aParent: TWinControl);
Begin
With TButton.Create(Application) Do
Begin
Left := 10;
Top := 10;
Parent := aParent;
End;
End;

Та же ошибка (cannot assign TFont to TFont)


REA   (2003-01-24 15:55:00) [8]

Забыл уже где видел - давно это было. Даже забыл в чем проявляется.


oomneeq   (2003-01-24 15:44:00) [9]

>REA © (24.01.03 15:31)
>.. когда идет каскадирование DLL-DLL-DLL, но это документированный баг Микрософт.

Что за документированный баг?
Мне актуально, как раз каскадирование.
Есть ссылка, где про него прочесть?



REA   (2003-01-24 15:31:00) [10]

Я проверю конечно, но кажется я уже пробовал - DLL и BPL в этом смысле не отличаются. А RTL я всегда подключаю - DLL без них глючат, хотя и с ними глючат, когда идет каскадирование DLL-DLL-DLL, но это документированный баг Микрософт.


Игорь Шевченко   (2003-01-24 15:26:00) [11]

REA © (24.01.03 15:21)


> при попытке добавить кнопку из DLL (или BPL) на панель основной
> программы вылетает "TFont is not TFont",


Из BPL этого быть не может.
hint: EXEшник тоже должен быть скомпилирован с использованием run-time пакетов.


REA   (2003-01-24 15:21:00) [12]

По порядку: при попытке добавить кнопку из DLL (или BPL) на панель основной программы вылетает "TFont is not TFont", что очевидно, поскольку для создания и Assign используются разные таблицы. Вопрос как их (RTTI) объединить либо создать класс в DLL (BPL) c помощью метакласса основной программы (ссылающийся на RTTI Exe), что бы не возникало конфликтов. Передачей указателя на FindClass из Exe в DLL не отделаться?


Игорь Шевченко   (2003-01-24 15:13:00) [13]


> если глобальные переменные общие (а это кстати как достигается?),
>


Помещением их в один пакет.

Остальные вопросы я не понял.


REA   (2003-01-24 15:11:00) [14]

Что то я запутался - если глобальные переменные общие (а это кстати как достигается?), то и FindClass должен возвращать одинаковые классы, поскольку использует глобальную переменную RegGroups для поиска. Почему тогда возникает несоответствие типов? Или я что-то не так делаю? А если в DLL передать указатель на FindClass, то можно создать класс из контекста программы по его имени?


REA   (2003-01-24 13:32:00) [15]

Да читал я эту статью 5 раз. О чем речь то? - разница может быть только за счет объявления асбсолютно абстрактных классов, но посколько я классы (кроме тех что определены в стандартных VCL) в DLL не использую, то DLL может быть даже меньше по размеру. Примерно 50к на плугин - меня это устраивает.

А вопрос про то что если зарегистрировать класс в DLL, а загрузить ресурс в основной программе, то при конструкции класса должна быть корректная ссылка на метакласс. Наверно это будет работать. Хотелось бы уйти от разных RTTI - чтобы из BPL была возможность расширять интерфейс.


Игорь Шевченко   (2003-01-23 14:35:00) [16]

>Код то тот же (он в BPL), а RTTI разные

Если с пакетами, то одинаковые.

Почему бы не почитать ?

http://www.delphikingdom.com/mastering/plugins.htm

RegisterClass будет, остальное - вопрос непонятен.


REA   (2003-01-23 11:28:00) [17]

Вопрос в догонку: будет ли для классов динамических BPL работать streaming system (RegisterClass/Save resource/Load resource) при вызове загрузки из основной программы?


REA   (2003-01-23 11:25:00) [18]

Статью читал несколько раз (и сегодня в том числе).

>О дублировании - класс TForm в DLL и TForm в EXE это два разных >класса, друг с другом не совместимые, по крайней мере по IS и AS.

Код то тот же (он в BPL), а RTTI разные. Это и неудобно. Потому и спрашиваю - даст ли использование BPL какой-то шаг в напралении объединения RTTI - сдается мне, что нет.

>Кроме того, дублируется переменная Application, отсюда проблемы с созданием в DLL MDIChild форм.

MDI мне в данном случае не нужен, но работает в других проектах и с MDI почти без проблем.


Игорь Шевченко   (2003-01-23 11:19:00) [19]

REA © (23.01.03 11:14)

А вместо DLL сразу BPL использовать ?
А статью прочитать ?

О дублировании - класс TForm в DLL и TForm в EXE это два разных класса, друг с другом не совместимые, по крайней мере по IS и AS.
Обычно это проявляется на классе TFont.
Кроме того, дублируется переменная Application, отсюда проблемы с созданием в DLL MDIChild форм.


REA   (2003-01-23 11:14:00) [20]

Если использовать DLL с включенными пакетами, то размер тот же. Приложение ориентировано на Delphi и не планируется расширение на другие языки.

Application конечно неудобная вешь, но не принципиальная.
А что там насчет дублирования VMT?


Страницы:   1 2

Наверх

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