Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > самовыгрузка динамической библиотеки


Автор: shara 13.1.2009, 23:31
хочу научиться выгружать свою динамическую DLLку из программы, точнее чтобы библиотека сама выгружалась. я пробовал так:

Код

FreeLibrary(GetModuleHandle(NULL)); //  вызываю внутри библиотеки

но сия строчка полностью завершает выполнение всей программы что абсолютно неприемлемо 

пробовал еще FreeLibraryAndExitThread - эффект аналогичен  smile 

можно конечно не париться и не выгружать либу из файла... темболее что сам EXEфайл ее к себе не подключает (в идеале даже не подозревает о существовании библиотеки) но все же хочется ее убрать(читай выгрузить) если конкретный исполняемый файл нам не интересен 

Автор: Romikgy 13.1.2009, 23:52
Цитата(shara @  13.1.2009,  22:31 Найти цитируемый пост)
FreeLibrary(GetModuleHandle(NULL));

попробуй вместо нуль поставить хендл библиотеки , ибо нуль это самого приложения
Цитата(shara @  13.1.2009,  22:31 Найти цитируемый пост)
FreeLibraryAndExitThread

и библа и приложение выполняется в одном и томже триде!

Автор: shara 14.1.2009, 00:02
Цитата(Romikgy @  13.1.2009,  22:52 Найти цитируемый пост)
попробуй вместо нуль поставить хендл библиотеки , ибо нуль это самого приложения

собсно я то думал что вызывая GetModuleHandle  с параметром NULL из тела самой библиотеки мне его и дадут...
а как тогда по другому сей хендл можно узнать? повторюсь, сам ЕХЕшник о существовании библиотеки не подозревает - тоесть он хендл не вернет... 
что-то мне подсказывает что можно хендл узнать функцией аналогичной GetProcAddress но поиск в МСДНе ничего не принес

Автор: dumb 14.1.2009, 17:18
GetModuleHandle("имя_твоей_длл")

Автор: Earnest 14.1.2009, 17:41
Или запомнить его на входе в DllMain - там тебе его дают.

Автор: shara 14.1.2009, 21:03
всем спасибо  smile 
но я нашел более простой способ: если ДЛЛка возвращает при обработке сообщения DLL_PROCESS_ATTACH в DllMain значение FALSE то она автоматически вызывается еще раз с сообщением DLL_PROCESS_DETACH  и  автоматически выгружается из процесса (как раз то что мне и нужно было). Даже вызывать никаких функций не нужно - красота  smile.  хотя сия возможность  smile  используется не совсем по назначению

цитата из MSDN
Цитата

When the system calls the DllMain function with the DLL_PROCESS_ATTACH value, the function returns TRUE if it succeeds or FALSE if initialization fails. If the return value is FALSE when DllMain is called because the process uses the LoadLibrary function, LoadLibrary returns NULL. (The system immediately calls your entry-point function with DLL_PROCESS_DETACH and unloads the DLL.) If the return value is FALSE when DllMain is called during process initialization, the process terminates with an error. To get extended error information, call GetLastError.

еще раз спасибо всем за помощь

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)