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

К>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

К>{
К> .....
К>};
К>// и так везде!
К>[/c]
К>Подобным образом обеспечивается живучесть Inproc COM Server'ов — DLL живёт до тех пор, пока есть COM-объекты, созданные ею.

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


Ха. код dec_ref находится в component.dll, вызывает FreeLibrary(себя же), в которой выгружается component.dll, return и мы оказываемся в вакууме
Я пробовал аналогичный вариант, только не через множественное наследование.


template< typename U > 
class LockLibrary : public U
{
public:
     LockLibrary()
          : lib_( ::LoadLibraryA( g_strModuleFileName ) )
     {
     }

private:
     ScopedLoadLibrary lib_;
};


// и в коде
throw LockLibrary< my_exception >;


все именно так и происходит


В COM-е насколько я знаю есть глобальная функция DllCanUnloadNow, по которой клиентский модуль и принимает решение — выгружать/не выгружать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.