Здравствуйте, Кодт, Вы писали:
К>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, по которой клиентский модуль и принимает решение — выгружать/не выгружать.