Re[2]: Exception from dll -> dll unload -> AV
От: Кодт Россия  
Дата: 04.12.11 02:11
Оценка:
Здравствуйте, Amor, Вы писали:

A>Какие будут предложения?


Предложение такое: продлить время жизни библиотеки до самого последнего момента.
Что-то в таком роде
// внутри DLL

HMODULE g_hDLL;
ULONG g_nRef = 0;
void add_ref() { ++g_nRef; }
void dec_ref() { if(--g_nRef) FreeLibrary(g_hDLL); }

struct dll_reference
{
  dll_reference() { add_ref(); }
  dll_reference(const dll_reference&) { add_ref(); }
  ~dll_reference() { dec_ref(); }
};

struct my_exception : std::exception, dll_reference
{
  .....
};
// и так везде!

Подобным образом обеспечивается живучесть Inproc COM Server'ов — DLL живёт до тех пор, пока есть COM-объекты, созданные ею.

Подсчёт ссылок удобно делать интрузивным, а то и вообще переложить на плечи ядра (LoadLibrary/FreeLibrary тоже считают ссылки в недрах).
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.