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

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

Обязательно ли вызывать FreeLibrary?


Страницы:   1 2

Fay ©   (2005-11-02 09:27:00) 

В одном из модулей в initializationвызывается LoadLibrary для некоторой DLL.
Можно ли обойтись без FreeLibrary в finalization?
Уменьшится ли "DLL reference count" просто из-за завершения процесса?


evvcom   (2005-11-02 23:12:00) [1]

Fay, ты прям какой-то партизан или ты у Пельша учился? Устроил нам тут угадайку. Хоть бы чуть больше осветил, что за модули такие.
Я как-то перехватывал API-вызовы своей dll, которую "чужой" exe сам грузил (даже внедрять не надо было :) ) Ну так раз в нем была задумана загрузка плагина, то естественно была и выгрузка. Вот на этой выгрузке я и получал AV. А все просто оказалось. Приложение было Сишное, оно создавало отдельный поток, читало адрес перехватываемой мною функции, сохраняло его в регистре, и поток крутился в цикле, не меняя этот регистр, и время от времени делая jmp <регистр>. Да... Дельфовый компилятор так не компилит. Естественно после FreeLibrary этот jmp и вызывал AV. Так и пришлось перехватывать еще и FreeLibrary, чтобы добиться "плохого тона в программировании" :)


Fay   (2005-11-02 18:17:00) [2]

>> Модуль возвращает ссылку на какие-то данные из длл
Пока не нашёл такого ...


DiamondShark   (2005-11-02 17:07:00) [3]


> DiamondShark ©   (02.11.05 16:57) [19]

Но тут, наверное, не тот случай.
ДЛЛ ведь не дельфийская?

Тогда такой вариант.
Модуль возвращает ссылку на какие-то данные из длл, эта ссылка сохраняется и используется в каком-то модуле, финализация которого происходит позже выгрузки ДЛЛ.


DiamondShark   (2005-11-02 16:57:00) [4]


> Fay ©   (02.11.05 14:16) [14]
> 2 Leonid Troyanovsky ©   (02.11.05 14:11) [13]
> >> некорректная работа со строками
> Это как?

Некогда, не очень давно, был тут пример с возвращением константной строки и последующим FreeLibrary.

Примерно такое:

-- длл --
function Foo: string;
begin
 Result := 'Haligali balalaika';
end;

exports Foo;
--------

Последовательность кода вроде

LoadLibrary(...);
Bar := Foo;
FreeLibrary(...);
Bar := '';

Приводит к AV.
Надеюсь, понятно почему...


Fay   (2005-11-02 15:28:00) [5]

2 Leonid Troyanovsky ©   (02.11.05 15:24) [17]
>> FreeLibrary можно смело плюнуть.
Я так и сделал, просто хотел выяснить, что это не есть жуткий криминал...


Leonid Troyanovsky   (2005-11-02 15:24:00) [6]


> Fay ©   (02.11.05 15:06) [16]
> 2 Leonid Troyanovsky ©   (02.11.05 14:58) [15]
> Не, я таких мест не нашёл.


Ну, может, порядок финализации библиотеки требуется другой,
или там работают дополнительные потоки (как в common dialogs).
А раз так, и нет планов на динамическую загрузку,
то на собс-ручный FreeLibrary можно смело плюнуть.

--
Regards, LVT.


Fay   (2005-11-02 15:06:00) [7]

2 Leonid Troyanovsky ©   (02.11.05 14:58) [15]
Не, я таких мест не нашёл.


Leonid Troyanovsky   (2005-11-02 14:58:00) [8]


> Fay ©   (02.11.05 14:16) [14]
> 2 Leonid Troyanovsky ©   (02.11.05 14:11) [13]
> >> некорректная работа со строками
> Это как?


Ну, например, в длине буфера ошиблись.

--
Regards, LVT.


Fay   (2005-11-02 14:16:00) [9]

2 Leonid Troyanovsky ©   (02.11.05 14:11) [13]
>> некорректная работа со строками
Это как?


Leonid Troyanovsky   (2005-11-02 14:11:00) [10]


> Fay ©   (02.11.05 13:48) [12]
> 2 Leonid Troyanovsky ©   (02.11.05 13:16) [11]
> Я взял на себя смелость отправить Вам 2 исп. модуля.


И чем я провинился?
IMHO, это support@helpware.net

В качестве рабочей гипотезы - некорректная работа со строками.

--
Regards, LVT.


Fay   (2005-11-02 13:48:00) [11]

2 Leonid Troyanovsky ©   (02.11.05 13:16) [11]
Я взял на себя смелость отправить Вам 2 исп. модуля.
Вы, думаю, сможете сразу оценить их "объектность", и м.б. скажете в чём ошибка.

З.Ы.
Я сейчас использую только 1 функцию - HtmlHelpA.


Leonid Troyanovsky   (2005-11-02 13:16:00) [12]


> Fay ©   (02.11.05 12:45) [9]
> 2 Digitman ©   (02.11.05 12:42) [8]
> Других глюков там нет, да и не могёт быть - это просто интерфейс
> к API.
> У вас есть конкретные подозрения?


У меня есть.
Это, видимо, объектный интерфейс (а иначе зачем).
Сл-но, глюки есть.

--
Regards, LVT.


Digitman   (2005-11-02 13:14:00) [13]


> Fay ©   (02.11.05 12:45) [9]


> да и не могёт быть - это просто интерфейс к API


"наглюкавить" при желании можно где угодно)


> У вас есть конкретные подозрения?


откуда ж они возьмутся ?

я понятия не имею, о какой конкретно библ-ке идет речь ...

могу лишь сказать, что если она действительно "глюкавая", то тот же глюк, по идее, должен выплыть и при вне блоков init/final ... с учетом того что между загрузкой и выгрузкой ты более нигде и никак не обращаешься к библ-ке


Fay   (2005-11-02 12:45:00) [14]

2 Digitman ©   (02.11.05 12:42) [8]
Других глюков там нет, да и не могёт быть - это просто интерфейс к API.
У вас есть конкретные подозрения?


Digitman   (2005-11-02 12:42:00) [15]


> Fay ©   (02.11.05 12:31) [7]


а мысли про вполне вероятную "глючность" этого самого "чужого модуля" при этом не возникло ?


Fay   (2005-11-02 12:31:00) [16]

Спасибо всем за ответы!

2 Digitman ©   (02.11.05 10:46) [5]
2 evvcom ©   (02.11.05 10:40) [4]
2 evvcom ©   (02.11.05 10:57) [6]

Дело в том, что у меня используется чужой модуль для работы с HTML-Help, в котором как раз такой код встречается - LoadLibrary в initialization и FreeLibrary в finalization.
Так вот при закрытии программы часто (на одном из компов почти всегда, на моём очень редко) вызазит AV. Убрал FreeLibrary - галюн исчез.
Вот я и решил спросить про енто дело.


evvcom   (2005-11-02 10:57:00) [17]


> на камень в мой огород

не... не камень. Просто дополнение для Fay, чтобы не расслаблялся.


Digitman   (2005-11-02 10:46:00) [18]


> evvcom ©   (02.11.05 10:40) [4]


на камень в мой огород скажу - да, лучше явно выполнять FreeLibrary() ..


evvcom   (2005-11-02 10:40:00) [19]

+ к "можно" и "да": Но это дурной тон в программировании. Об этом, кстати, сообщит MemProof.


GuAV   (2005-11-02 10:01:00) [20]

Fay ©   (02.11.05 9:27)
Можно ли обойтись без FreeLibrary в finalization?


Можно. Как и оставить незакрытый хендл (файла) - он всё равно закроется или выделенную и не освобождённую память - она всё равно будет освобождена при выгрузке процесса.


Страницы:   1 2

Наверх

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