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