![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL. Ошибка при использовании типа string в ее функциях
Старик © (2006-03-22 07:31:00)Привет.
Напоролся на ошибку при выгрузке DLL из памяти (FreeLibrary), если в них есть функции, возвращающие результатом string.
В моих DLL была такая функция для идентификации (я использую динамическое подключение), которая возвращала string.
Эта ошибка исчезла, стоило мне только заменить тип функции со string на PChar. Т.е. саму проблему я решил.
Если кто-нибудь знает, в чем здесь суть проблемы, поделитесь своими соображениями.
KSergey (2006-03-24 16:17:00) [1]или еще фанский вариант - пользовать wstring
Для них единый менеджер дельфи пользует из Windows подсистемы COM
Старик (2006-03-24 12:33:00) [2]>>Amoeba
Спасибо, попробую его поюзать :) А он и правда так быстр, как заявлено в названии?
Amoeba (2006-03-24 11:37:00) [3]Кроме ShareMem существуют и альтернативные менеджеры памяти не использующие DLL, например FastMM.
Старик (2006-03-22 09:03:00) [4]Сергей М., MBo
Спасибо, что доступно растолковали :)
Сергей М. (2006-03-22 08:52:00) [5]
> меня интересует сама причина этого явления
Причина проста - при формировании результата ф-ции память под значение типа String выделяется одним экземпляром менеджера памяти, а освободить эту память после получения результата пытается другой экз-р менеджера памяти. А у каждого экз-ра менеджера памяти свои внутренние списки, в которых менеджер ведет учет блоков памяти, формируемых вызовами GetMem/ReallocMem/FreeMem. Сабж, кстати, касается не только String, но и любых типов данных, явно или неявно подразумевающих динамическое перераспределение памяти при передаче в DLL параметров и получении результатов.
Решение при этом очевидно - дать компилятору указание об использовании вызывающим и вызываемым кодом единого экз-ра менеджера. Это достигается либо использованием ShareMem (в нем реализован тот самый независимый менеджер) либо сборкой взаимодействующих проектов с установленной опцией линкера Build With Run-Time Packages (в этом случае будет использован единый менеджер в составе RTLXX.BPL)
MBo (2006-03-22 08:48:00) [6]Причина в том, что при работе с длинными строками и динамическими массивами в основной программе и DLL должен использоваться единый менеджер памяти. Вот подключение Sharemem это как раз и обеспечивает (правда, ценой таскания с собой borlndmm.dll)
Старик (2006-03-22 08:37:00) [7]Да, читал. Насколько я понял, там говорится о том, что для использования string нужно подключить модуль ShareMem, иначе юзать не string, а PChar или ShortString. Но меня интересует сама причина этого явления.
MBo (2006-03-22 08:03:00) [8]При создании проекта-DLL вначале идет комментарий. Читал?