![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обязательно ли вызывать FreeLibrary?
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?
Можно. Как и оставить незакрытый хендл (файла) - он всё равно закроется или выделенную и не освобождённую память - она всё равно будет освобождена при выгрузке процесса.