Главная страница
    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.48 MB
Время: 0.01 c
6-37815
UNick
2003-11-14 16:14
2004.01.13
Как мне задать тему письма


6-37832
demongr
2003-11-09 21:13
2004.01.13
idhttp1.Get и Proxy


1-37663
Строитель
2003-12-26 17:05
2004.01.13
Версия, билд и пр. информация о проекте


14-37853
Ozone
2003-12-23 05:40
2004.01.13
Оформление программ


7-37944
Tomkat
2003-10-31 09:05
2004.01.13
Сгорит ли LPT ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский