Re[2]: Exception from dll -> dll unload -> AV
От: MasterZiv СССР  
Дата: 04.12.11 07:57
Оценка:
On 12/03/2011 09:49 PM, Amor wrote:

> так все-таки как поступать, если все компилируется в одном компиляторе, хочется

> динамическую загрузку библиотек и кидание исключений?
>

Я не очень понимаю, в чём проблема. В смысле, что тут нет проблемы.

> Допустим такой код:

>
> {
> ScopedLoadLibrary lib ("component.dll" );
> ComponentPtr comp = ComponentFactory::CreateInstance();
>
> comp->DoSomething();// и отсюда вылетает некий class myexception : public std::exception
> }

> Вроде бы нормальный с точки зрения клиентского вызова код.

> Но код myexception::~myexception находится в component.dll, а это значит, что в
> catch-е который его отловит модуль уже будет выгружен.
> И когда CRT-шный код пытается удалить объект — происходит AV.

как бы если этот exception определён в этом модуле, то клиенты exception-а
(те, кто его использует) будут клиентами и этого модуля. Если модуль
выгружается, когда у него есть действующие (активные) клиентны, это , очевидно,
неправильно, это делать нельзя. Если у тебя такое есть, значит либо .ddl нельзя
выгружать до окончания обработки исключения, либо исключение это надо определять
не в этой .dll, одно из двух.

Либо откладывай момент выгрузки .ddl, в Win32 это можно например делать
отправкой сообщения (PostMessage) о необходимости выгрузки .ddl.

Либо выноси исключение в отдельный, используемый всеми и невыгружаемый модуль.

Можно ещё (но это вариация на тему выноса исключения) сделать залипуху,
ловить вокруг этого кода исключение, перекодировать его в другое, общее
исключение и перебрасывать. Но это для случаев, когда данную .ddl менять нельзя.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.