![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передать объект в DLL [D6, Win95/98]
b-Ars © (2003-02-06 12:28:00)Здравствуйте! Нужна компетентная информация. Как передавать в/из DLL не просто строки или числа, а объекты, например, если у меня есть в проге компонент TTable, и я им же хочу воспользоваться в библиотеке. Да, и про BORLNDMM.DLL можно поподробнее? Спасибо.
Ihor Osov'yak (2003-02-10 20:04:00) [1]2 b-Ars © (07.02.03 13:33)
Читать внимательно viajero (07.02.03 13:13), после прочтения думать, и так много раз до тех пор, пока желание ваше не исчезнет.
Зы - если очень все-же охота, можно работать через интерфейсы.
Armen (2003-02-10 19:36:00) [2]TTable в dll не получится, сам с этим столкнулся года 2 назад.
Дело в том, что все выводится к неявному вызову методов TApplication из dll, и так как Application в dll и в exe разные при деструкции TTable получиш exception. Кстати этим обьясняется и ненормальное поведение TSpeedButton в dll-е когда Flat:= true.
Лечится легко и сердито:
вместо dll создаем bpl и импорт экспорт классов гарантирован.
b-Ars (2003-02-07 13:33:00) [3]>AlexanderSK © (07.02.03 13:30)
Ок, теперь буду пробовать, может чего нарою интересного, Всем БОЛЬНОЕ СПАСИБО!
AlexanderSK (2003-02-07 13:30:00) [4]>b-Ars © (07.02.03 13:13)
Да Т - это таблица в DLL
viajero (2003-02-07 13:13:00) [5]При использовании объектов в ДЛЛ
есть по крайней мере 3 тонких момента:
1. RTTI в основной программе и в ДЛЛ будет разная,
соответственно, as и is для объектов основной программы
в ДЛЛ и наоборот работать не будут.
Соответственно, те объектные свойства,
Set-метод которых работает через Assign
(который проверяет динамический тип),
тоже не будут присваиваться.
И все прочие методы, где используется
RTTI, тоже не будут работать.
2. Глобальные объекты в ДЛЛ и основном приложении будут разные - это Application (обходится присваиванием хэндла), Screen, менеджеры ресурсов (FontManager и др.),
менеджер памяти (обходится использованием ShareMem) и др.,
в том числе пользовательские.
3. В осн. программе и в ДЛЛ могут быть
разные версии объектов.
b-Ars (2003-02-07 13:13:00) [6]>AlexanderSK © (07.02.03 13:08)
Тогда я вот это не очень понимаю:
передавать можно так: LongInt(Table);
а получать так: T := TTable(LongInt);
T - здесь это кто? Таблица в DLL?
AlexanderSK (2003-02-07 13:08:00) [7]>b-Ars © (07.02.03 13:00
>Меня смущает только почему не Handle передаем
Table.Handle - это совем не тот Handle который есть например у TButton! Насколько я это понимаю!
b-Ars (2003-02-07 13:00:00) [8]>Palladin © (07.02.03 12:57)
Честно :))), готовлюсь к этому шагу.
Меня смущает только почему не Handle передаем
Palladin (2003-02-07 12:57:00) [9]2 b-Ars
Скажи чесно. Ты пробовал это реализовать? То есть сам посмотреть, прокатит это или нет?
b-Ars (2003-02-07 12:54:00) [10]Palladin © (07.02.03 12:42)
> динамическая
AlexanderSK (2003-02-07 12:49:00) [11]Это-то все работает! Но вот когда я пытаюсь в Dll сделать что-нибудь типа: DataSource.DataSet := Table, причем DataSource связан с DBGrid - вот тут-то и начинают валиться ошибки! можно ли что-нибудь с этим сделать?
AlexanderSK (2003-02-07 12:46:00) [12]>b-Ars © (07.02.03 12:37)
>Вы хотите сказать, что этот вот так вот просто прокатит?
Да! это работает!
передавать можно так: LongInt(Table);
а получать так: T := TTable(LongInt);
Palladin (2003-02-07 12:42:00) [13]у тебя библиотека динамическая или статическая?
b-Ars (2003-02-07 12:37:00) [14]>Palladin © (07.02.03 12:31)
Плиз, покажите, как нужно его передавать...
Palladin (2003-02-07 12:31:00) [15]а ты хочешь сказать что это у тебя вот так вот просто так не прокатило? не вижу причин чтобы не прокатило (если конечно указатель правильный передается)...
b-Ars (2003-02-07 12:20:00) [16]Ближе к понедельнику посмотрим что из этого дельно получится
>mrcat © (06.02.03 13:10)
>Palladin © (06.02.03 13:13)
"Умели пользоваться"
Например:
В главной программе таблица MyTable:
Пишу: MyTable.Exclusive:=True;
А в DLL мне к примеру надо сказать MyTable.Exclusive:=False;
Вы хотите сказать, что этот вот так вот просто прокатит?
AlexsanderSK (2003-02-06 13:34:00) [17]>b-Ars
Ну как? Что-нибудь дельное получилось?
AlexsanderSK (2003-02-06 13:25:00) [18]У меня например проблема в следующем:
Вот кусок кода из DLL
procedure SetTable(T: TIBTable); stdcall;
begin
TestForm.TB := T;
TestForm.DataSource1.DataSet := TestForm.TB;
end;
При вызове этой функции из основной прграммы все нормально работает до вызова TestForm.DataSource1.DataSet := TestForm.TB;!
После этого происходит исключение - EInvalidPointer! В чем тут дело?
Palladin (2003-02-06 13:13:00) [19]
> надо, чтобы процедуры из DLL умели пользоваться методами
> и свойствами того же TTable из главной программы.
чесно говоря я тоже не понял этого, в чем проблема то?
mrcat (2003-02-06 13:10:00) [20]При выпечке пирогов надо знать "тонкости" =)
надо, чтобы процедуры из DLL умели пользоваться методами и свойствами того же TTable из главной программы.
и чего не получается?