Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.27;
Скачать: CL | DM;

Вниз

Обязательно ли вызывать 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.028 c
8-1120170499
ronyn
2005-07-01 02:28
2005.11.27
Неужели нет короткого кода для изменения громкости?!


3-1129265104
iamkate
2005-10-14 08:45
2005.11.27
Проблемы с загрузкой данных из потока


14-1131494060
JUS
2005-11-09 02:54
2005.11.27
Есть ли сайт где можно сразу отправить много много смс сообщений?


14-1131007894
Иксик
2005-11-03 11:51
2005.11.27
Харьковчане, скажите код :)


2-1131565651
Haillies
2005-11-09 22:47
2005.11.27
Пинг