HINSTANCE dllp = LoadLibrary("tvcrt.dll");
...
...
...
while (FreeLibrary == 0)FreeLibrary(dllp);
Выгрузка DLL
загружаю и выгружаю:
Код:
однако в самой dll ф-я
Код:
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
{
return 1;
}
вызывается не только на FreeLibrary но и при закрытии основного приложения, т.е. после выполнения while (FreeLibrary == 0)FreeLibrary(dllp);
в чем может быть дело, и как исправить?
Код:
while (FreeLibrary == 0)
FreeLibrary это что?
описался....
ЗЫ: А вопрос в другом был: почему после выгрузки библиотеки при закрытии основной программы вызывается ф-я инициализирующая dll ?
Так Вы ж тогда библиотеку в этой конструкции два раза подряд выгружаете. Сначала в теле цикла, а потом в условии.
Т.е. фактически второй раз проводите операцию с невалидным указателем.
Попробуйте так:
Код:
bool result=false;
while(!result)
{
result=FreeLibrary(dllp);
}
while(!result)
{
result=FreeLibrary(dllp);
}
Хотя, я бы на вашем месте не засовывал бы критические секции программы в потенциально бесконечные циклы. Попробуйте try и catch.
Цитата: Gigahard
while (FreeLibrary(dllp) == 0)FreeLibrary(dllp);
Так Вы ж тогда библиотеку в этой конструкции два раза подряд выгружаете. Сначала в теле цикла, а потом в условии.
Т.е. фактически второй раз проводите операцию с невалидным указателем.
Попробуйте так:
Хотя, я бы на вашем месте не засовывал бы критические секции программы в потенциально бесконечные циклы. Попробуйте try и catch.
Так Вы ж тогда библиотеку в этой конструкции два раза подряд выгружаете. Сначала в теле цикла, а потом в условии.
Т.е. фактически второй раз проводите операцию с невалидным указателем.
Попробуйте так:
Код:
bool result=false;
while(!result)
{
result=FreeLibrary(dllp);
}
while(!result)
{
result=FreeLibrary(dllp);
}
Хотя, я бы на вашем месте не засовывал бы критические секции программы в потенциально бесконечные циклы. Попробуйте try и catch.
да вопрос то не в этом...
библиотека выгружается успешно, но при закрытии приложения опять к ней обращается что то
В вашем случае программа может впадать в бесконечный цикл по выгрузке DLL.
В теле цикла Вы вызываете функцию выгрузки библиотеки. Указатель освобождается и становится невалидным. Затем в условии цикла, Вы еще раз вызываете функцию выгруза библиотеки, но указатель уже не валидный. Хорошо, если функция при этом вернет ненулевой ответ. А если нет? Бесконечный цикл выгрузки библиотеки получите.
Цитата: oxotnik333
да вопрос то не в этом...
библиотека выгружается успешно, но при закрытии приложения опять к ней обращается что то
библиотека выгружается успешно, но при закрытии приложения опять к ней обращается что то
По умолчанию система не выгружает длл из процесса сразу.
Цитата: kot_
По умолчанию система не выгружает длл из процесса сразу.
получается что система ее вообще не выгружает из процесса, только при выходе из самого процесса.
Как изменить это "по умолчанию" программно?
Цитата: Gigahard
Вы пробывали код изменить?
В вашем случае программа может впадать в бесконечный цикл по выгрузке DLL.
В теле цикла Вы вызываете функцию выгрузки библиотеки. Указатель освобождается и становится невалидным. Затем в условии цикла, Вы еще раз вызываете функцию выгруза библиотеки, но указатель уже не валидный. Хорошо, если функция при этом вернет ненулевой ответ. А если нет? Бесконечный цикл выгрузки библиотеки получите.
В вашем случае программа может впадать в бесконечный цикл по выгрузке DLL.
В теле цикла Вы вызываете функцию выгрузки библиотеки. Указатель освобождается и становится невалидным. Затем в условии цикла, Вы еще раз вызываете функцию выгруза библиотеки, но указатель уже не валидный. Хорошо, если функция при этом вернет ненулевой ответ. А если нет? Бесконечный цикл выгрузки библиотеки получите.
код менял, в т.ч. и без цикла делал Load/Free - Library, но (извините за резкость) к делу отношения вообше не имеет
Цитата: oxotnik333
получается что система ее вообще не выгружает из процесса, только при выходе из самого процесса.
Как изменить это "по умолчанию" программно?
Как изменить это "по умолчанию" программно?
Проверь параметр в реестре -
Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
AlwaysUnloadDll
AlwaysUnloadDll
он должен быть установлен в 1
Я не знаю решит ли это твою проблему - сейчас разбираться некогда - но возможно это то что тебе надо. И посмотри подробней в Рихтере.