Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

DLL. Ошибка при использовании типа string в ее функциях   Найти похожие ветки 

 
Старик   (2006-03-22 07:31) [0]

Привет.
Напоролся на ошибку при выгрузке DLL из памяти (FreeLibrary), если в них есть функции, возвращающие результатом string.

В моих DLL была такая функция для идентификации (я использую динамическое подключение), которая возвращала string.
Эта ошибка исчезла, стоило мне только заменить тип функции со string на PChar. Т.е. саму проблему я решил.
Если кто-нибудь знает, в чем здесь суть проблемы, поделитесь своими соображениями.


 
MBo ©   (2006-03-22 08:03) [1]

При создании проекта-DLL вначале идет комментарий. Читал?


 
Старик   (2006-03-22 08:37) [2]

Да, читал. Насколько я понял, там говорится о том, что для использования string нужно подключить модуль ShareMem, иначе юзать не string, а PChar или ShortString. Но меня интересует сама причина этого явления.


 
MBo ©   (2006-03-22 08:48) [3]

Причина в том, что при работе с длинными строками и динамическими массивами  в основной программе и DLL должен использоваться единый менеджер памяти. Вот подключение Sharemem это как раз и обеспечивает (правда, ценой таскания с собой borlndmm.dll)


 
Сергей М. ©   (2006-03-22 08:52) [4]


> меня интересует сама причина этого явления


Причина проста - при формировании результата ф-ции память под значение типа String выделяется одним экземпляром менеджера памяти, а освободить эту память после получения результата пытается другой экз-р менеджера памяти. А у каждого экз-ра менеджера памяти свои внутренние списки, в которых менеджер ведет учет блоков памяти, формируемых вызовами GetMem/ReallocMem/FreeMem. Сабж, кстати, касается не только String, но и любых типов данных, явно или неявно подразумевающих динамическое перераспределение памяти при передаче в DLL параметров и получении результатов.

Решение при этом очевидно - дать компилятору указание об использовании вызывающим и вызываемым кодом единого экз-ра менеджера. Это достигается либо использованием ShareMem (в нем реализован тот самый независимый менеджер) либо сборкой взаимодействующих проектов с установленной опцией линкера Build With Run-Time Packages (в этом случае будет использован единый менеджер в составе RTLXX.BPL)


 
Старик   (2006-03-22 09:03) [5]

Сергей М., MBo
Спасибо, что доступно растолковали :)


 
Amoeba ©   (2006-03-24 11:37) [6]

Кроме ShareMem существуют и альтернативные менеджеры памяти не использующие DLL, например FastMM.


 
Старик   (2006-03-24 12:33) [7]

>>Amoeba
Спасибо, попробую его поюзать :) А он и правда так быстр, как заявлено в названии?


 
KSergey ©   (2006-03-24 16:17) [8]

или еще фанский вариант - пользовать wstring
Для них единый менеджер дельфи пользует из Windows подсистемы COM



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

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.309 c
15-1144291672
TUser
2006-04-06 06:47
2006.04.30
Вот почему у нас такие выборы ...


1-1143046865
Gear
2006-03-22 20:01
2006.04.30
RxRichEdit и линки


15-1144403920
Ega23
2006-04-07 13:58
2006.04.30
Случайно буду в Москве с ночёвкой.


4-1139568531
Vlad2
2006-02-10 13:48
2006.04.30
Как определить, нажата ли левая клавиша мыши


15-1144588919
Бугага
2006-04-09 17:21
2006.04.30
"Дефис" вместо "минуса"