C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
AnsiString и DLL, Access violation при выходе из программы
Бромгексин
Отправлено: 13.05.2004, 08:39


Не зарегистрирован







Добрый день!
Пожалуйста, подскажите. Используется ВСВ6. Столкнулся со следующей проблемой. Есть dll(1), написанная на VС++ и экспортирующая кучу C функций. Задача создать целый комплекс программ, каждая из которых использует эту dll. К этой dll был написан модуль, который облегчает работу с ней и использует AnsiString. Этот модуль включался в каждую из программ. Модуль представляет собой класс. Хотелось бы вынести этот модуль в новую dll(2) и использовать ее. Таким образом получается: dll(2) использует dll(1) (lib файл был конвертирован в OMF и подключен к проекту). Таким образом, dll(2) экспортирует класс. Также, в dll(2) подключен memmgr.lib (для работы с AnsiString). Компилляция dll(2) прошла без ошибок и на "Ура!".
В host программе объявил переменную указатель на класс, импортированный из dll(2), включил также lib файл от новой dll(2) и memmgr.lib для AnsiString. Компилляция прошла также замечательно. Программа запускается и чудесно работает. НО! Если попытаться сделать delete для этой переменной, то при выходе из программы получается Access violation, толи read, толи write какого-то там адреса. Если убрать delete, то все нормально работает, вот только resource leak получается.
Что делать? В чем может быть проблема. От AnsiString, TStringList и TList отказаться не могу, иначе все удобство пропадет, да и переделывать много придется.
Помогите плз.
Asher
Отправлено: 13.05.2004, 13:57


Мастер участка

Группа: Модератор
Сообщений: 550



Насколько я понял вы создаете переменную в dll а убить пытаетесь в exe. Это делать нельзя, т.к. хип у всех разный.
Вы должны удалять в том же адресном пространстве, где и создавали.

И еще — прочтите это Подключение borlmm.dll в случае линковки со статической CRTL может поможет.
Бромгексин
Отправлено: 13.05.2004, 14:48


Не зарегистрирован







Уважаемый, Asher!
А прокатит-ли такой финт. Объявляю переменную указатель на класс в самой DLL, там же ее инициализирую. Только экспортирую уже не класс, а функции (например, добавлю простые функции в DLL, которые будут обращатсья к функциям класса или просто перепишу класс).
Добавлю функцию удаления этого указателя в саму DLL.
Как тогда?
Asher
Отправлено: 13.05.2004, 16:19


Мастер участка

Группа: Модератор
Сообщений: 550



IMHO теперь проще добавить функцию удаления туда-же, где и функция создания.

Хотя по абстрактной теории следовало писать "чистые" функции работы с данными, а потом вызывать их из методов класса (может даже и инлайн). Тогда это позволило бы использовать их в различных требуемых вариантах, в том числе и с контейнерами и алгоритмами STL (и в качестве предикатов в частности)

Вернуться в Вопросы программирования в C++Builder