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

Вниз

Передать объект в DLL   Найти похожие ветки 

 
b-Ars   (2003-02-06 12:28) [0]

Здравствуйте! Нужна компетентная информация. Как передавать в/из DLL не просто строки или числа, а объекты, например, если у меня есть в проге компонент TTable, и я им же хочу воспользоваться в библиотеке. Да, и про BORLNDMM.DLL можно поподробнее? Спасибо.


 
Palladin   (2003-02-06 12:36) [1]

либо у тебя два ника... либо это совпадение...
http://delphi.mastak.com/cgi-bin/forum.pl?look=1&id=1044523487&n=0

передавай их как pointer, или integer :)) и делай привидение типов в dll.
может получится :)


 
AlexanderSK   (2003-02-06 12:47) [2]

Это совпадение! А подробней можно? А то видимо я что-то не так передаю (через указатели) не работает!


 
b-Ars   (2003-02-06 12:48) [3]

>Palladin © (06.02.03 12:36)
Честное слово совпадение :)))

Т.е. просто сделать процедуру myProc(MyTable: TTable) в DLL нельзя?


 
mrcat   (2003-02-06 12:54) [4]

b-Ars © (06.02.03 12:28)

F1

On Windows, if a DLL exports routines that pass long strings or dynamic arrays as parameters or function results (whether directly or nested in records or objects), then the DLL and its client applications (or DLLs) must all use the ShareMem unit. The same is true if one application or DLL allocates memory with New or GetMem which is deallocated by a call to Dispose or FreeMem in another module. ShareMem should always be the first unit listed in any program or library uses clause where it occurs.

ShareMem is the interface unit for the BORLANDMM.DLL memory manager, which allows modules to share dynamically allocated memory. BORLANDMM.DLL must be deployed with applications and DLLs that use ShareMem. When an application or DLL uses ShareMem, its memory manager is replaced by the memory manager in BORLANDMM.DLL.
Linux uses glibc’s malloc to manage shared memory.


Как передавать в/из DLL не просто строки или числа, а
объекты


http://delphi.mastak.ru/articles/dll_use/index.html


 
Palladin   (2003-02-06 12:59) [5]

почему?
можно.
Само использование TTable уже предполагает что библиотека будет использоватся только прогой написаной на делфи...
так что можно смело писать и так.


 
b-Ars   (2003-02-06 13:02) [6]

>mrcat © (06.02.03 12:54)
Оч. остроумно... Английский язык я знаю. Думал, может кто опытом поделится, может там ещё какие тонкости как обычно. А за синк спасибо.

А ситуация такая: надо, чтобы процедуры из DLL умели пользоваться методами и свойствами того же TTable из главной программы.


 
b-Ars   (2003-02-06 13:04) [7]

>Palladin © (06.02.03 12:59)
Так, ок, а про утечки памяти в этом случае (как раз F1). Это вот не очень понятно.


 
Palladin   (2003-02-06 13:10) [8]

какие еще утечки памяти, откуда они тут могут быть?
естественно память утечет :)) если ты TTable не освободишь.
Но ты должен определится где TTable у тебя будет создаватся и где освобождатся...

вообще говоря не вижу ничего в этом вопросе связанного с утечкой памяти...


 
mrcat   (2003-02-06 13:10) [9]

При выпечке пирогов надо знать "тонкости" =)

надо, чтобы процедуры из DLL умели пользоваться методами и свойствами того же TTable из главной программы.

и чего не получается?


 
Palladin   (2003-02-06 13:13) [10]


> надо, чтобы процедуры из DLL умели пользоваться методами
> и свойствами того же TTable из главной программы.

чесно говоря я тоже не понял этого, в чем проблема то?


 
AlexsanderSK   (2003-02-06 13:25) [11]

У меня например проблема в следующем:
Вот кусок кода из DLL
procedure SetTable(T: TIBTable); stdcall;
begin
TestForm.TB := T;
TestForm.DataSource1.DataSet := TestForm.TB;
end;

При вызове этой функции из основной прграммы все нормально работает до вызова TestForm.DataSource1.DataSet := TestForm.TB;!
После этого происходит исключение - EInvalidPointer! В чем тут дело?


 
AlexsanderSK   (2003-02-06 13:34) [12]

>b-Ars
Ну как? Что-нибудь дельное получилось?


 
b-Ars   (2003-02-07 12:20) [13]

Ближе к понедельнику посмотрим что из этого дельно получится

>mrcat © (06.02.03 13:10)
>Palladin © (06.02.03 13:13)

"Умели пользоваться"
Например:
В главной программе таблица MyTable:

Пишу: MyTable.Exclusive:=True;
А в DLL мне к примеру надо сказать MyTable.Exclusive:=False;

Вы хотите сказать, что этот вот так вот просто прокатит?





 
Palladin   (2003-02-07 12:31) [14]

а ты хочешь сказать что это у тебя вот так вот просто так не прокатило? не вижу причин чтобы не прокатило (если конечно указатель правильный передается)...


 
b-Ars   (2003-02-07 12:37) [15]

>Palladin © (07.02.03 12:31)
Плиз, покажите, как нужно его передавать...


 
Palladin   (2003-02-07 12:42) [16]

у тебя библиотека динамическая или статическая?


 
AlexanderSK   (2003-02-07 12:46) [17]

>b-Ars © (07.02.03 12:37)
>Вы хотите сказать, что этот вот так вот просто прокатит?

Да! это работает!

передавать можно так: LongInt(Table);
а получать так: T := TTable(LongInt);


 
AlexanderSK   (2003-02-07 12:49) [18]

Это-то все работает! Но вот когда я пытаюсь в Dll сделать что-нибудь типа: DataSource.DataSet := Table, причем DataSource связан с DBGrid - вот тут-то и начинают валиться ошибки! можно ли что-нибудь с этим сделать?


 
b-Ars   (2003-02-07 12:54) [19]

Palladin © (07.02.03 12:42)
> динамическая


 
Palladin   (2003-02-07 12:57) [20]

2 b-Ars
Скажи чесно. Ты пробовал это реализовать? То есть сам посмотреть, прокатит это или нет?


 
b-Ars   (2003-02-07 13:00) [21]

>Palladin © (07.02.03 12:57)
Честно :))), готовлюсь к этому шагу.
Меня смущает только почему не Handle передаем


 
AlexanderSK   (2003-02-07 13:08) [22]

>b-Ars © (07.02.03 13:00
>Меня смущает только почему не Handle передаем
Table.Handle - это совем не тот Handle который есть например у TButton! Насколько я это понимаю!


 
b-Ars   (2003-02-07 13:13) [23]

>AlexanderSK © (07.02.03 13:08)
Тогда я вот это не очень понимаю:
передавать можно так: LongInt(Table);
а получать так: T := TTable(LongInt);

T - здесь это кто? Таблица в DLL?



 
viajero   (2003-02-07 13:13) [24]

При использовании объектов в ДЛЛ
есть по крайней мере 3 тонких момента:

1. RTTI в основной программе и в ДЛЛ будет разная,
соответственно, as и is для объектов основной программы
в ДЛЛ и наоборот работать не будут.

Соответственно, те объектные свойства,
Set-метод которых работает через Assign
(который проверяет динамический тип),
тоже не будут присваиваться.

И все прочие методы, где используется
RTTI, тоже не будут работать.

2. Глобальные объекты в ДЛЛ и основном приложении будут разные - это Application (обходится присваиванием хэндла), Screen, менеджеры ресурсов (FontManager и др.),
менеджер памяти (обходится использованием ShareMem) и др.,
в том числе пользовательские.

3. В осн. программе и в ДЛЛ могут быть
разные версии объектов.


 
AlexanderSK   (2003-02-07 13:30) [25]

>b-Ars © (07.02.03 13:13)
Да Т - это таблица в DLL


 
b-Ars   (2003-02-07 13:33) [26]

>AlexanderSK © (07.02.03 13:30)
Ок, теперь буду пробовать, может чего нарою интересного, Всем БОЛЬНОЕ СПАСИБО!


 
Armen   (2003-02-10 19:36) [27]

TTable в dll не получится, сам с этим столкнулся года 2 назад.
Дело в том, что все выводится к неявному вызову методов TApplication из dll, и так как Application в dll и в exe разные при деструкции TTable получиш exception. Кстати этим обьясняется и ненормальное поведение TSpeedButton в dll-е когда Flat:= true.
Лечится легко и сердито:
вместо dll создаем bpl и импорт экспорт классов гарантирован.


 
Ihor Osov'yak   (2003-02-10 20:04) [28]

2 b-Ars © (07.02.03 13:33)

Читать внимательно viajero (07.02.03 13:13), после прочтения думать, и так много раз до тех пор, пока желание ваше не исчезнет.

Зы - если очень все-же охота, можно работать через интерфейсы.



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

Форум: "Основная";
Текущий архив: 2003.02.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.014 c
14-53207
Рустам
2003-01-31 14:24
2003.02.17
TeamSource


1-53035
Sergei
2003-02-06 12:52
2003.02.17
Технология IDL


1-53094
UserL
2003-02-07 07:12
2003.02.17
Как сделать чтоб в TStringGrid-е сначала подсвечивалась бы строка


1-52833
super_alex
2003-02-07 12:35
2003.02.17
Как выйти из цикла?


14-53216
Delirium^.Tremens
2003-01-31 14:35
2003.02.17
Кадровая политика vs Национальный вопрос





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