** 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
|
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 |
Так желательно, а не обязательно...
QUOTE | Можно конечно и не выгружать если не интересует дальнейшая работа ОС |
Вот, по-моему, как раз на дальнейшей работе ОС это никак не скажется (обсуждаем загрузку/выгрузку dll). При закрытии процесса ОС автоматически освобождает все, занимаемые этим процессом, ресурсы. А уж за ресурсами своими она, благо, тщательно следит... |
|
AVC |
Отправлено: 01.07.2004, 12:05 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Ресурс не может быть выгружен, пока счетчик не станет нулем.
Может современные винды и правильно следет, но в то время, когда я это осваивал для Builder'а (Builder 3, Win95) я получал нарастающее количество ошибок вплоть до полного отказа системы. Навыки полученные там не мешают мне и сейчас.
Хочешь что бы было хорошо — сделай сам. |
|
Father |
Отправлено: 01.07.2004, 18:06 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 17
|
QUOTE | Хочешь что бы было хорошо — сделай сам. |
Это само собой! |
|