C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Выгрузка dll
** pasha
Отправлено: 30.06.2004, 09:55


Не зарегистрирован







Два вопроса по работе с динамически загружаемыми dll

Есть программа, которая динамически загружает некоторые dll.
(через LoadLibrary)
При этом dll остаются загруженными до конца работы программы.

Нужно-ли при завершении моей программы обязательно
делать FreeLibrary всем этим dll, или после завершении программы
эти dll будут выгружены из памяти сами ???
AVC
Отправлено: 30.06.2004, 10:54


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Нужно-ли при завершении моей программы обязательно
делать FreeLibrary всем этим dll

Да
** pasha
Отправлено: 30.06.2004, 11:34


Не зарегистрирован







Тогда еще вопрос -

могу-ли я сделать массив HINSTANCE для Dll
а в конце программы взять эти HINSTANSE из
этого массива и сделать всем dll FreeLibrary() ?

то есть
CODE

struct LOADDLL{
    int ID;
    HINSTANCE hDll;
    }myDll[20];
int countDll=0;

....

HINSTANCE tekDll = LoadLibrary("123.dll");
myDLL[countDLL].hDll = tekDll;      countDLL++;



CODE

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
     for(int i=0; i<countDLL; i++) FreeLibrary(myDLL[i].hDll);
}

AVC
Отправлено: 30.06.2004, 12:08


Ветеран

Группа: Модератор
Сообщений: 1583



Да, но я поступаю несколько иначе:
1. При старте приложения запоминаю все библиотеки, загруженные Borland'ом — он сам ими управляет и не дай бог ему помешать (а грузит до того, как я получаю управление).
2. Перед самым завершением выгружаю все, не принадлежащее списку, полученному при старте.
Father
  Отправлено: 30.06.2004, 15:23


Ученик-кочегар

Группа: Участник
Сообщений: 17



QUOTE
Да

AVC, а какое обоснование данного факта?
Просто, по-моему, вручную освобождать библиотеки ни к чему...
AVC
Отправлено: 30.06.2004, 16:32


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

вручную освобождать библиотеки ни к чему

По странному стечению обстоятельств каждый вызов LoadLibrary желательно сопровождать FreeLibrary (хотя бы для правильнго подсчета ссылок). Отсюда правило: все что прикомпановано Builder'ом не трогать — разберется сам, все что грузилось "ручками" должно быть выгружено. Можно конечно и не выгружать если не интересует дальнейшая работа ОС.

Отредактировано AVC — 30/06/2004, 16:42
Father
  Отправлено: 01.07.2004, 11:51


Ученик-кочегар

Группа: Участник
Сообщений: 17



"вручную освобождать библиотеки ни к чему" — это я не совсем правильно написал — я подразумевал "не обязательно".
QUOTE
каждый вызов LoadLibrary желательно сопровождать FreeLibrary

Так желательно, а не обязательно... smile.gif
QUOTE
Можно конечно и не выгружать если не интересует дальнейшая работа ОС

Вот, по-моему, как раз на дальнейшей работе ОС это никак не скажется (обсуждаем загрузку/выгрузку dll). При закрытии процесса ОС автоматически освобождает все, занимаемые этим процессом, ресурсы. А уж за ресурсами своими она, благо, тщательно следит... smile.gif
AVC
Отправлено: 01.07.2004, 12:05


Ветеран

Группа: Модератор
Сообщений: 1583



Ресурс не может быть выгружен, пока счетчик не станет нулем.
Может современные винды и правильно следет, но в то время, когда я это осваивал для Builder'а (Builder 3, Win95) я получал нарастающее количество ошибок вплоть до полного отказа системы. Навыки полученные там не мешают мне и сейчас.
Хочешь что бы было хорошо — сделай сам.
Father
  Отправлено: 01.07.2004, 18:06


Ученик-кочегар

Группа: Участник
Сообщений: 17



QUOTE
Хочешь что бы было хорошо — сделай сам.

Это само собой! biggrin.gif

Вернуться в Вопросы программирования в C++Builder