Форум: "Основная";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизОбязательно ли вызывать FreeLibrary? Найти похожие ветки
← →
Fay © (2005-11-02 09:27) [0]В одном из модулей в initialization вызывается LoadLibrary для некоторой DLL.
Можно ли обойтись без FreeLibrary в finalization?
Уменьшится ли "DLL reference count" просто из-за завершения процесса?
← →
Slym © (2005-11-02 09:39) [1]Уменьшит при закрытии...
А если это динамически загружаемый модуль, (bpl,dll) то лучше всетаки вызывать FreeLibrary
← →
Digitman © (2005-11-02 09:44) [2]
> Можно ли обойтись без FreeLibrary в finalization?
можно
> Уменьшится ли "DLL reference count" просто из-за завершения
> процесса?
да
← →
GuAV © (2005-11-02 10:01) [3]Fay © (02.11.05 9:27)
Можно ли обойтись без FreeLibrary в finalization?
Можно. Как и оставить незакрытый хендл (файла) - он всё равно закроется или выделенную и не освобождённую память - она всё равно будет освобождена при выгрузке процесса.
← →
evvcom © (2005-11-02 10:40) [4]+ к "можно" и "да": Но это дурной тон в программировании. Об этом, кстати, сообщит MemProof.
← →
Digitman © (2005-11-02 10:46) [5]
> evvcom © (02.11.05 10:40) [4]
на камень в мой огород скажу - да, лучше явно выполнять FreeLibrary() ..
← →
evvcom © (2005-11-02 10:57) [6]
> на камень в мой огород
не... не камень. Просто дополнение для Fay, чтобы не расслаблялся.
← →
Fay © (2005-11-02 12:31) [7]Спасибо всем за ответы!
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 - галюн исчез.
Вот я и решил спросить про енто дело.
← →
Digitman © (2005-11-02 12:42) [8]
> Fay © (02.11.05 12:31) [7]
а мысли про вполне вероятную "глючность" этого самого "чужого модуля" при этом не возникло ?
← →
Fay © (2005-11-02 12:45) [9]2 Digitman © (02.11.05 12:42) [8]
Других глюков там нет, да и не могёт быть - это просто интерфейс к API.
У вас есть конкретные подозрения?
← →
Digitman © (2005-11-02 13:14) [10]
> Fay © (02.11.05 12:45) [9]
> да и не могёт быть - это просто интерфейс к API
"наглюкавить" при желании можно где угодно)
> У вас есть конкретные подозрения?
откуда ж они возьмутся ?
я понятия не имею, о какой конкретно библ-ке идет речь ...
могу лишь сказать, что если она действительно "глюкавая", то тот же глюк, по идее, должен выплыть и при вне блоков init/final ... с учетом того что между загрузкой и выгрузкой ты более нигде и никак не обращаешься к библ-ке
← →
Leonid Troyanovsky © (2005-11-02 13:16) [11]
> Fay © (02.11.05 12:45) [9]
> 2 Digitman © (02.11.05 12:42) [8]
> Других глюков там нет, да и не могёт быть - это просто интерфейс
> к API.
> У вас есть конкретные подозрения?
У меня есть.
Это, видимо, объектный интерфейс (а иначе зачем).
Сл-но, глюки есть.
--
Regards, LVT.
← →
Fay © (2005-11-02 13:48) [12]2 Leonid Troyanovsky © (02.11.05 13:16) [11]
Я взял на себя смелость отправить Вам 2 исп. модуля.
Вы, думаю, сможете сразу оценить их "объектность", и м.б. скажете в чём ошибка.
З.Ы.
Я сейчас использую только 1 функцию - HtmlHelpA.
← →
Leonid Troyanovsky © (2005-11-02 14:11) [13]
> 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 14:16) [14]2 Leonid Troyanovsky © (02.11.05 14:11) [13]
>> некорректная работа со строками
Это как?
← →
Leonid Troyanovsky © (2005-11-02 14:58) [15]
> Fay © (02.11.05 14:16) [14]
> 2 Leonid Troyanovsky © (02.11.05 14:11) [13]
> >> некорректная работа со строками
> Это как?
Ну, например, в длине буфера ошиблись.
--
Regards, LVT.
← →
Fay © (2005-11-02 15:06) [16]2 Leonid Troyanovsky © (02.11.05 14:58) [15]
Не, я таких мест не нашёл.
← →
Leonid Troyanovsky © (2005-11-02 15:24) [17]
> 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:28) [18]2 Leonid Troyanovsky © (02.11.05 15:24) [17]
>> FreeLibrary можно смело плюнуть.
Я так и сделал, просто хотел выяснить, что это не есть жуткий криминал...
← →
DiamondShark © (2005-11-02 16:57) [19]
> 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.
Надеюсь, понятно почему...
← →
DiamondShark © (2005-11-02 17:07) [20]
> DiamondShark © (02.11.05 16:57) [19]
Но тут, наверное, не тот случай.
ДЛЛ ведь не дельфийская?
Тогда такой вариант.
Модуль возвращает ссылку на какие-то данные из длл, эта ссылка сохраняется и используется в каком-то модуле, финализация которого происходит позже выгрузки ДЛЛ.
← →
Fay © (2005-11-02 18:17) [21]>> Модуль возвращает ссылку на какие-то данные из длл
Пока не нашёл такого ...
← →
evvcom © (2005-11-02 23:12) [22]Fay, ты прям какой-то партизан или ты у Пельша учился? Устроил нам тут угадайку. Хоть бы чуть больше осветил, что за модули такие.
Я как-то перехватывал API-вызовы своей dll, которую "чужой" exe сам грузил (даже внедрять не надо было :) ) Ну так раз в нем была задумана загрузка плагина, то естественно была и выгрузка. Вот на этой выгрузке я и получал AV. А все просто оказалось. Приложение было Сишное, оно создавало отдельный поток, читало адрес перехватываемой мною функции, сохраняло его в регистре, и поток крутился в цикле, не меняя этот регистр, и время от времени делая jmp <регистр>. Да... Дельфовый компилятор так не компилит. Естественно после FreeLibrary этот jmp и вызывал AV. Так и пришлось перехватывать еще и FreeLibrary, чтобы добиться "плохого тона в программировании" :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.019 c