Поиск:

Ответ в темуСоздание новой темы Создание опроса
> самовыгрузка динамической библиотеки 
V
    Опции темы
shara
Дата 13.1.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



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

Код

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

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

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

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


Это сообщение отредактировал(а) shara - 13.1.2009, 23:34


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Romikgy
Дата 13.1.2009, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 2
Всего: 146



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

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

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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
shara
Дата 14.1.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



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

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


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
dumb
Дата 14.1.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: нет
Всего: 158



GetModuleHandle("имя_твоей_длл")
PM MAIL   Вверх
Earnest
Дата 14.1.2009, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Или запомнить его на входе в DllMain - там тебе его дают.


--------------------
...
PM   Вверх
shara
Дата 14.1.2009, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 29.6.2004
Где: печенье?

Репутация: нет
Всего: 2



всем спасибо  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.

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


Это сообщение отредактировал(а) shara - 14.1.2009, 21:11


--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1163 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.