Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

Создание компонента в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.015 c
7-37964
Сергей Уфимский
2003-11-01 00:53
2004.01.13
Получение пакета через COM порт


7-37949
nollie
2003-10-29 18:25
2004.01.13
com


1-37783
Agent13
2003-12-29 13:19
2004.01.13
Необычный ControlBar


1-37706
ss300
2003-12-23 14:29
2004.01.13
OpenDialog


1-37656
BOA_KAA
2003-12-25 20:09
2004.01.13
Почему вываливается External Exception?





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