Текущий архив: 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