Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.23;
Скачать: CL | DM;

Вниз

выгрузка DLL   Найти похожие ветки 

 
AlexSK   (2002-03-20 12:38) [0]

Как выгрузить, загруженную ранее (LoadLibryay) DLL!
FreeLibryay - выгружает, но Dll ысе равно считается используемой приложением, до завершения приложения!


 
Виктор Щербаков   (2002-03-20 12:42) [1]

Сколько раз вызвана LoadLibrary, столько раз и нужно вызвать FreeLibrary. Тогда счетчик использований обнулится и система не будет считать dll используемой твоим (не остальными) приложением. Вот и все дела.


 
VuDZ   (2002-03-20 12:46) [2]

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


 
Fellomena   (2002-03-20 13:17) [3]

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


 
Виктор Щербаков   (2002-03-20 13:28) [4]

Дык ведь речь и не шла о выгрузке из физической памяти.
В вопросе говорилось о счетчике использования.


 
VuDZ   (2002-03-20 13:40) [5]

это был ответ на упреждение, мало ли что...


 
AlexSK   (2002-03-20 13:45) [6]

Да это все замечательно! Это то я все заню!
НО мне нужно удалить DLL из своего приложения после использования (выгрузки), а этого сделать неудается т.к. ОС недает! Как тут быть?


 
VuDZ   (2002-03-20 15:44) [7]

???
Может Free Library вызывать до упора? Или чего ты хочешь?


 
Fellomena   (2002-03-20 16:41) [8]

По идее, если ниодно приложение не использует более эту dll, то, даже если эта dll кэшированав память, а ты пробуешь стереть её - это должно получиться !
Но, если ты это пробуешь сделать под отладчиком (в Delphi F9), то это не получится, потому как Delphi загружает в своё адресное пространство dll, которую твоё приложение использует.
Попробуй сделать всё как делал, но не из Делфей, а уже на самом exe-шнике.


 
Raptor   (2002-03-20 17:11) [9]

Если ДЛЛ больше не используется, то ее можно удалить. Соответственно если нельзя - значит она кем то еще используется. Наверное ты используешь статическое подключение, а при этом ДЛЛ остается загруженой до конца работы приложения. Попробуй использовать динамическое подключение. Или еще. Если это у тебя ДЛЛ с глобальным хуком, то она подгружается в адр. простр. всех процессов. Потому до окончания работы приложения она остается загруженой и, соответственно, не может быть удалена.
А вообще причин может быть масса. Опиши задачу поконкретнее. Тогда будем решать.


 
Bachin   (2002-03-20 21:09) [10]

как ты загружаешь либу? я лично делаю так: и ни каких проблем!

{
Create IXObject from IXLibrary
}
Result := NIL;
HLibrary := GetModuleHandle( PChar(FileName) ); // if Library alredy loaded
if HLibrary = 0 then
HLibrary := LoadLibrary( PChar(FileName) ); // if Library exist
if HLibrary = 0 then
Exit;


 
AlexSK   (2002-03-21 14:20) [11]

Вот первый кусок:

Dll := LoadLibrary("Midas.Dll");
RegDll := GetProcAddress(Dll, "DllRegisterServer");
RegDll;
FreeLibrary(WDll);

А вот второй:

Dll := LoadLibrary("Midas.Dll");
UnRegDll := GetProcAddress(Dll, "DllUnregisterServer");
UnRegDll;
FreeLibrary(Dll);
DeleteFile("Midas.Dll");

"Midas.Dll" - естественно везде с полным путем!

Так вот если выполняем сначала 1-ую, а потом 2-ую часть, то Длл не удаляется! А если 1-ую, выгружаем приложение, тутже загружаем снова, и выполняем 2-ую часть - удвляется!

Во как!



 
kig   (2002-03-21 16:28) [12]

Если речь о inproc-серверах, попробуйте воспользуйться ф-цией

CoFreeUnusedLibrariesEx
Unloads any DLLs that are no longer in use and whose unload delay has expired.

void CoFreeUnusedLibrariesEx(
DWORD dwUnloadDelay, //The unload delay for DLLs no longer in use
DWORD dwReserved //Reserved for future use
);
Parameters
dwUnloadDelay
[in] The delay in milliseconds between the time that the DLL has stated it can be unloaded until it becomes a candidate to unload. Setting dwUnloadDelay=INFINITE uses the system default delay (10 minutes). Setting dwUnloadDelay=0 forces the unloading of any DLLs without any delay.
dwReserved
[in] Reserved for future use; must be zero


после FreeLibrary.



Страницы: 1 вся ветка

Текущий архив: 2002.05.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
14-73372
ATLANTIDO
2002-04-14 21:01
2002.05.23
Каааак ?


3-73005
sergey32
2002-04-25 10:55
2002.05.23
Как в Interbase числовое поле с атрибутами NOT NULL


1-73113
Lesha
2002-05-12 21:44
2002.05.23
Меню как в IE


6-73338
Nevmerj
2002-03-14 02:28
2002.05.23
ReadFile/WriteFile


1-73319
Startwar
2002-05-12 00:53
2002.05.23
Проблема с MDI формами