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

Вниз

Создание компонента в DLL   Найти похожие ветки 

 
Эдуард   (2003-12-26 11:32) [0]

Уважаемые мастера! Есть такая проблема:

1. В DLL"ке написана функция, которая, к примеру возвращает созданный TButton;
2. Когда пытаюсь вызвать её из приложения, и вставить полученный Button на форму, ничего не получается.
3. При этом если функцию продублировать в приложение, а не брать из DLL, то всё работает...

Подскажите в чём дело ( отдельное спасибо - за примеры)?


 
Юрий Федоров ©   (2003-12-26 11:37) [1]

Как вставляешь на форму ?
Как именно не получается ?
Если приложение и библиотека скомпилированы без использования пакетов, а "вставка на форму" осуществляется присвоением Button.Parent, ничего не выйдет


 
Sandman25 ©   (2003-12-26 11:47) [2]

Если возвращается именно TButton, то вместо DLL лучше писать BPL.


 
Эдуард   (2003-12-26 11:47) [3]

Функция в DLL"ке:

function CreateTButton(AOwner : TComponent) : TButton; stdcall;
begin
Result := TButton.Create(AOwner);
end;


В программе её использую:

function CreateTButton(AOwner : TComponent) : TButton; stdcall; external "SomeDLL.dll" name "CreateTButton";
...
procedure TForm1.Button1Click(Sender: TObject);
begin
btn := CreateTButton(self); // btn - public поле формы
Panel1.InsertControl(btn); // Panel1 лежит на форме
end;


 
TUser ©   (2003-12-26 11:48) [4]

btn:=CreateTButton)self);
btn.parent:=Panel1;


 
Эдуард   (2003-12-26 11:50) [5]

Да я вообще пробовал указатель возвращать, а какая структура данных - всё равно, TButton или TPoint... Но по поинтеру кнопка тоже не передавалась.

ps.: кнопку я использую как тест, итоговое приложение будет возвращать нечто посложнее, напр. фрейм.


 
Эдуард   (2003-12-26 11:51) [6]

присвоение Parent"а тоже пробовал - не работает. Кстати если не ошибаюсь, это эквивалентно InsertContol у Parent...


 
sniknik ©   (2003-12-26 12:33) [7]

просто пример
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1070358516&n=0


 
Эдуард   (2003-12-26 14:24) [8]

За пример спасибо. Но он не работает :(
Почти такая же фигня - при вызове DLL-функции создания формы выскакивает исключение...

У меня предположение: возможно это связано с адресным пространством? Но если не ошибаюсь, адресное пространство библиотеки отображается на адресное пространство приложения? Может работать через MemoryMapedFiles, только как :\

Задача распространённая, кто сталкивался, подскажите, плиз!


 
Daemys ©   (2003-12-26 14:42) [9]

Компонент нельзя импортировать из dll, кроме как целком с формой. И вообще в разных модулях (exe и dll) получаются разные иерарархии.


 
alex_*** ©   (2003-12-26 15:01) [10]

возвращай свой интерфейс и в него передавай Parent, координаты и все такое. У меня работает, правда пакеты динамически цепляются. и разделение логики от реализации опять же.


 
sniknik ©   (2003-12-26 15:16) [11]

> Но он не работает :(
не может быть.
может не работает так как вам нужно? это другое дело.


 
Эдуард   (2003-12-26 15:39) [12]

отвечаю:
я скачал архив по ссылке, далее скомпилировал DLL, и EXE.
Запустил EXE, при нажатии на "PushMe" выскакивает исключение.

ps.: в режиме отладки исключение выпадает в этой строке:

if DllFormCreate(Application.Handle, MainForm, DataSource1)
then Close; //делать то больше нехрен!


 
sniknik ©   (2003-12-26 16:28) [13]

в исключении какиенибудь надписи есть?

специально перепроверил перекомпилил из архива который закачивал, работает (так же и у других обсуждали этот пример уже), D7 - D6.

файл dbf -ный рядом не удалил случаем? BDE стоит? пример в основном на таблицу. ??? ну пишет то чего?

может дело в компиляции (ехешник выслать чтоли).


 
REA ©   (2003-12-26 16:32) [14]

Да сколько можно одно и то же. Нужно делать bpl и все будет хорошо.


 
just me   (2003-12-26 17:10) [15]

bpl не обязательно, но собрать с runtime packages - обязательно


 
Эдуард   (2003-12-26 17:53) [16]

1. Пишет вот что:
Exeption EReadError in module MyDLL.dllat 00017BAE

компилирую под D5;

2. Вопрос такой: были ответы, что типа из DLL только форму можно создать, а другие контролы - нет. Но почему? Важно знать причины, а не следствия

3. Про bpl.
3.1. Что за зверь такой, и какая разница между ним и DLL?
3.2. Может ли он грузится динамически, как DLL?
3.3. Спасибо!


 
Sandman25 ©   (2003-12-26 18:02) [17]

3.1 Это DLL, но с дополнительными механизмами. И сама DLL, и хост должны быть написаны на Delphi. Используется без никаких дополнительных фокусов - делаешь Package, включаешь в него нужные модули и компилируешь его.
Из хоста работаешь с функциями, процедурами и переменными BPL точно так же, как если бы они были объявлены в том же приложении. Кстати, если убрать Build with Runtime package, то код из BPL просто вставится в Exe. И не надо будет ничего менять.
3.2 Да. Точно так же, как и обычные DLL.


 
Эдуард   (2003-12-27 01:39) [18]

Тогда ещё такой вопрос:
Загружаю динамически пакет, используя

LoadPackege("SomePackege.bpl");

Как "вытащить" из пакета адрес проседуры? Попробовал GetProcAddress - не работает :(

ps.: грузить нужно именно динамически, такова необходимость.



Страницы: 1 вся ветка

Текущий архив: 2004.01.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
1-37691
Эли
2003-12-23 14:10
2004.01.13
Иконки в файле Project.res


7-37956
z_h_e
2003-10-29 20:27
2004.01.13
LPT


3-37513
JIH
2003-12-16 00:41
2004.01.13
Нужна база на interbase


1-37608
mik_1
2003-12-28 18:29
2004.01.13
прерывание исполнения программы


14-37883
Mihey
2003-12-20 23:37
2004.01.13
Вот так глюк