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

Вниз

Параметры функций в dll   Найти похожие ветки 

 
_alex_   (2004-06-09 14:32) [0]

Добрый день!
У меня вопрос. Я перенес несколько функций из своего приложения в отдельную dll. И в одной из этих функций в качестве параметра передается VCL-компонента. В приложении все было нормально, а вот в dll-ке ей это не нравиться.
Какие параметры вообще можно передавать если используется вызов из dll?
Кстати в другой функции в качестве параметра передается переменная типа TStringList, результат тот же.


 
_alex_   (2004-06-09 14:39) [1]

И как быть в том случае если действительно надо в качестве параметра передать ссылку на какой-нибудь компонент?


 
Григорьев Антон ©   (2004-06-09 14:40) [2]

Про передачу классов в dll лучше забыть. Для этого есть bpl.


 
Cobalt ©   (2004-06-09 14:40) [3]

Можно попробовать работать через интерфейсы.


 
PVOzerski ©   (2004-06-09 14:46) [4]

Ну не надо длинные строки передавать между модулями, ни явно, ни неявно, если не использовать специальных средств работы с динамической памятью.


 
_alex_   (2004-06-09 16:29) [5]

> Григорьев Антон ©   (09.06.04 14:40) [2]
> Про передачу классов в dll лучше забыть. Для этого есть bpl.

А если я буду создавать эти классы уже в самой dll, это не будет вызывать серьезных ошибок в приложении?


 
Digitman ©   (2004-06-09 16:33) [6]


> если я буду создавать эти классы уже в самой dll, это не
> будет вызывать серьезных ошибок в приложении?


будет ... если нет понимания, чтот такое RTTI и VMT


 
_alex_   (2004-06-09 16:39) [7]

Так все таки в каком случае будут ошибки?
Я у себя попробовал таким способом - вроде работает.
Но хотелось бы знать как можно делать, а как нет.


 
panov ©   (2004-06-09 16:45) [8]

Вот такой комментарий появляется при использовании DLL-Wizard. Его надо почитать и запомнить.

library Project1;

{ Important note about DLL memory management: ShareMem must be the
 first unit in your library"s USES clause AND your project"s (select
 Project-View Source) USES clause if your DLL exports any procedures or
 functions that pass strings as parameters or function results. This
 applies to all strings passed to and from your DLL--even those that
 are nested in records and classes. ShareMem is the interface unit to
 the BORLNDMM.DLL shared memory manager, which must be deployed along
 with your DLL. To avoid using BORLNDMM.DLL, pass string information
 using PChar or ShortString parameters. }

uses
 SysUtils,
 Classes;

{$R *.res}

begin
end.


 
Григорьев Антон ©   (2004-06-09 16:54) [9]


> > Григорьев Антон ©   (09.06.04 14:40) [2]
> > Про передачу классов в dll лучше забыть. Для этого есть
> bpl.
>
> А если я буду создавать эти классы уже в самой dll, это
> не будет вызывать серьезных ошибок в приложении?


Проблемы возникают из-за того, что программа и DLL имеют каждая свою копию VCL. И, например, TComponent из программы - это не то же самое, что TComponent из DLL. Например, посмотрите вот такой код:


// В DLL
function GetMyStringList:TStringList;
begin
 Result:=TStringList.Create
end;

// В программе
MyStringList:=GetMyStringList;
if MyStringList is TStringList then (*)
...


Так вот, условие в строке (*) будет равно False, потому что MyStringList указывает на TStringList из DLL, а сравнивается с TStringList из программы, а это разные типы. Хотя и очень похожие, поэтому до определённой степени совместимые. Но, ИМХО, лучше забыть об этой частичной совместимости и исключить передачу объектов между программой и DLL. Пусть каждый объект используется только там, где он создан.


 
panov ©   (2004-06-09 17:16) [10]

>Григорьев Антон ©   (09.06.04 16:54) [9]
Так вот, условие в строке (*) будет равно False

Ничего подобного. Класс TStringList и в DLL, и в основном приложении, и в DLL один и тот же.

Разница в том, что используются разные менеджеры памяти...


 
Digitman ©   (2004-06-09 17:25) [11]


> Разница в том, что используются разные менеджеры памяти


... и добиться использования единого ММ для вызывающего и вызываемого модулей несложно, штатных вариантов всего 2 : либо задействование ShareMem (см.  [8]) либо сборка обоих модуль-проектов с опцией использования пакетов времени выполнения

все остальные "заморочки" сводятся к единым RTTI/VMT для вызывающего и вызываемого модулей, что обеспенчить совершенно несложно


 
Григорьев Антон ©   (2004-06-09 18:05) [12]


> panov ©   (09.06.04 17:16) [10]
>
> Ничего подобного. Класс TStringList и в DLL, и в основном
> приложении, и в DLL один и тот же.
>
> Разница в том, что используются разные менеджеры памяти...


А вы никогда не сталкивались с сообщениями типа "Cannot assign TFont to TFont" при передаче TCanvas между программой и DLL? Это как раз проявление такой проблемы. Класс в программе и в DLL имеют разные (хоть и идентичные) копии RTTI, и в некоторых случаях это существенно.


 
panov ©   (2004-06-09 19:36) [13]

>Digitman ©   (09.06.04 17:25) [11]
>Григорьев Антон ©   (09.06.04 18:05) [12]

Совершенно согласен-)



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

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

Наверх





Память: 0.48 MB
Время: 0.049 c
4-1085129307
Yustas
2004-05-21 12:48
2004.06.27
Память


14-1086598497
syte_ser78
2004-06-07 12:54
2004.06.27
кода на самсунг С-100


1-1086790419
TUser
2004-06-09 18:13
2004.06.27
Invalid parameter


1-1086768073
KSergey
2004-06-09 12:01
2004.06.27
О построении DBGridEh


8-1081869661
VitGun
2004-04-13 19:21
2004.06.27
DXF. Чтение отображение.





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