Текущий архив: 2004.06.27;
Скачать: CL | DM;
ВнизПараметры функций в 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;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.036 c