Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];

Вниз

выгрузка 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.006 c
7-73427
BMax
2002-02-24 12:21
2002.05.23
Реестр


14-73375
VCL
2002-04-15 22:12
2002.05.23
Вот...


1-73266
Sniffer
2002-05-10 01:04
2002.05.23
Классы


3-73035
Ivan Voronov
2002-04-26 12:20
2002.05.23
Использование собственных функций в SQL запросе...


1-73242
Filat
2002-05-10 12:04
2002.05.23
RX Library и разные версии Delphi. Как побороть?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский