Бромгексин |
Отправлено: 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 (и в качестве предикатов в частности)
|
|
|