Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

выгрузка DLL [D5, D6, Win95/98, WinME, Win2k]


AlexSK ©   (2002-03-20 12:38:00) 

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


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

Если речь о 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.


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

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

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-ую часть - удвляется!

Во как!


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

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

{
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;


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо