Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Выгрузка DLL

11
17 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
есть длл
загружаю и выгружаю:

 
Код:
HINSTANCE dllp = LoadLibrary("tvcrt.dll");
...
...
...
while (FreeLibrary == 0)FreeLibrary(dllp);


однако в самой dll ф-я

 
Код:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
        return 1;
}

вызывается не только на FreeLibrary но и при закрытии основного приложения, т.е. после выполнения while (FreeLibrary == 0)FreeLibrary(dllp);
в чем может быть дело, и как исправить?
590
17 декабря 2007 года
Gigahard
223 / / 03.04.2006
Вот этот кусок можете объяснить?
 
Код:
while (FreeLibrary == 0)

FreeLibrary это что?
11
17 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
while (FreeLibrary(dllp) == 0)FreeLibrary(dllp);

описался....

ЗЫ: А вопрос в другом был: почему после выгрузки библиотеки при закрытии основной программы вызывается ф-я инициализирующая dll ?
590
17 декабря 2007 года
Gigahard
223 / / 03.04.2006
while (FreeLibrary(dllp) == 0)FreeLibrary(dllp);

Так Вы ж тогда библиотеку в этой конструкции два раза подряд выгружаете. Сначала в теле цикла, а потом в условии.
Т.е. фактически второй раз проводите операцию с невалидным указателем.

Попробуйте так:

 
Код:
bool result=false;
while(!result)
{
result=FreeLibrary(dllp);
}


Хотя, я бы на вашем месте не засовывал бы критические секции программы в потенциально бесконечные циклы. Попробуйте try и catch.
11
17 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Gigahard
while (FreeLibrary(dllp) == 0)FreeLibrary(dllp);

Так Вы ж тогда библиотеку в этой конструкции два раза подряд выгружаете. Сначала в теле цикла, а потом в условии.
Т.е. фактически второй раз проводите операцию с невалидным указателем.

Попробуйте так:

 
Код:
bool result=false;
while(!result)
{
result=FreeLibrary(dllp);
}


Хотя, я бы на вашем месте не засовывал бы критические секции программы в потенциально бесконечные циклы. Попробуйте try и catch.



да вопрос то не в этом...
библиотека выгружается успешно, но при закрытии приложения опять к ней обращается что то

590
17 декабря 2007 года
Gigahard
223 / / 03.04.2006
Вы пробывали код изменить?

В вашем случае программа может впадать в бесконечный цикл по выгрузке DLL.

В теле цикла Вы вызываете функцию выгрузки библиотеки. Указатель освобождается и становится невалидным. Затем в условии цикла, Вы еще раз вызываете функцию выгруза библиотеки, но указатель уже не валидный. Хорошо, если функция при этом вернет ненулевой ответ. А если нет? Бесконечный цикл выгрузки библиотеки получите.
1
17 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
да вопрос то не в этом...
библиотека выгружается успешно, но при закрытии приложения опять к ней обращается что то


По умолчанию система не выгружает длл из процесса сразу.

11
17 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: kot_
По умолчанию система не выгружает длл из процесса сразу.



получается что система ее вообще не выгружает из процесса, только при выходе из самого процесса.
Как изменить это "по умолчанию" программно?

11
17 декабря 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Gigahard
Вы пробывали код изменить?

В вашем случае программа может впадать в бесконечный цикл по выгрузке DLL.

В теле цикла Вы вызываете функцию выгрузки библиотеки. Указатель освобождается и становится невалидным. Затем в условии цикла, Вы еще раз вызываете функцию выгруза библиотеки, но указатель уже не валидный. Хорошо, если функция при этом вернет ненулевой ответ. А если нет? Бесконечный цикл выгрузки библиотеки получите.



код менял, в т.ч. и без цикла делал Load/Free - Library, но (извините за резкость) к делу отношения вообше не имеет

1
17 декабря 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
получается что система ее вообще не выгружает из процесса, только при выходе из самого процесса.
Как изменить это "по умолчанию" программно?


Проверь параметр в реестре -

 
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
AlwaysUnloadDll

он должен быть установлен в 1
Я не знаю решит ли это твою проблему - сейчас разбираться некогда - но возможно это то что тебе надо. И посмотри подробней в Рихтере.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог