DLL

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Eugie, Romeo

Ответить
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 13:02
Откуда: Минск

DLL

Сообщение Kolinus » 08 ноя 2004, 13:21

Доброгго времени суток.
Вопрос:
//main.cpp
class A
{
int a();
virtual void b();
}

//dll.cpp
class B : public A
{
void b();
}

из главного приложения загружаю длл. вызываю функцию, которая возвращает мне указатель на объект класса B
выгружаю длл, не удаляя возвращенный объект.
после этого
из приложения вызываю
b->a() - все работает
b->b() - эксепшн.
В чем проблема ?
В SAD - все в SAD.

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сообщение Romeo » 08 ноя 2004, 19:39

Какой exception именно?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 13:02
Откуда: Минск

Сообщение Kolinus » 08 ноя 2004, 20:07

Access violation
В общем прокунсультировался еще с парой человек сказали что скорее всего фишка в том что при выгрузке длл разрушается виртуальная таблицп вызовов функций для данного объекта.
Есть соображения ?
В SAD - все в SAD.

Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сообщение Romeo » 08 ноя 2004, 20:14

Отследи в дебагере таблицу виртуальных методов, если подозрения подтвердятся и она окажется битой - выгружай DLL тогда, когда объект уже не нужен.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.

Eugie
Сообщения: 707
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Сообщение Eugie » 09 ноя 2004, 17:38

Kolinus, при выгрузке DLL ты теряешь доступ к коду, реализущему соотв.виртуальную функцию. Сама-то vtable остается при объекте, только указатели на методы в ней становятся инвалидными.

Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 13:02
Откуда: Минск

Сообщение Kolinus » 09 ноя 2004, 17:42

понятно.
Спасибо
В SAD - все в SAD.

Ответить