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

Вниз

Ошибка при FreeLibrary   Найти похожие ветки 

 
Alex_C   (2011-02-21 18:49) [0]

ПРи попытке FreeLibrary(MyDLL) появляется сообщение об ошибке доступа. Использую FastMM (В uses указана первой и в программе, и в dpr dll). Причем ошибка возникает не сразу, при вызове из программы FreeLibrary (я это делаю при Destroy основного приложения), а уже в момент самого закрытия приложения. Не могу понять причину.


 
Игорь Шевченко ©   (2011-02-21 18:54) [1]

Я тоже не могу понять причину


 
clickmaker ©   (2011-02-21 19:00) [2]

как вариант: в dll, в чьем-нибудь деструкторе или в секции finalization, есть обращение к невалидной области памяти
отладчик в руки


 
Юрий Зотов ©   (2011-02-21 20:24) [3]

> В uses указана первой и в программе...

В программе - где именно?


 
_Юрий   (2011-02-21 21:01) [4]

Скорее всего, выделялась память в библиотеке, а освободить ее пытается хост.
Такое может быть например, если между библиотекой и хостом передавались параметры с автоматическим временем жизни (строки, дин массивы )


 
sniknik ©   (2011-02-21 21:13) [5]

> передавались параметры с автоматическим временем жизни (строки, дин массивы )
на то и используется общий менеджер памяти чтобы можно было передавать, и не заботится.


 
RWolf ©   (2011-02-21 23:02) [6]

предлагаю для начала избавиться от секций initialization/finalization в программе, заменив их экспортируемыми функциями.


 
RWolf ©   (2011-02-21 23:02) [7]


> в программе

в DLL, конечно.


 
Игорь Шевченко ©   (2011-02-21 23:11) [8]

предлагаю ветку закрыть, а автора забанить


 
_Юрий   (2011-02-22 00:23) [9]


> sniknik ©   (21.02.11 21:13) [5]


> на то и используется общий менеджер памяти чтобы можно было
> передавать, и не заботится.


Разве FastMM может использоваться как внешний?


 
sniknik ©   (2011-02-22 01:28) [10]

> Разве FastMM может использоваться как внешний?
вроде можно, как пишут, главное не "мешать в кучу" разные механизмы.
Description:
A fast replacement memory manager for Borland Delphi Win32 applications that
scales well under multi-threaded situations, is not prone to memory
fragmentation, and supports shared memory without the use of external .DLL
files
.


 
Alex_C   (2011-02-22 16:49) [11]


> В программе - где именно?


В dpr-файле.

Вообще уважаемые гуру, объясните мне по длл следующее (прочитал много статей, но эта тема как то освещена не полностью): можно ли в качестве аргумента и результата ф-ции использовать string, если в качестве менеджера памяти используется FastMM?
Везде, где я читал, как то странно сказано: ножно, но не нужно. Т.е. не сказано, что нельзя, но и не рекомендуется.
Второе: можно ли в качестве аргумента в длл передавать укезатель допустим на StringList (procedure P(var S: TStringList)?


 
sniknik ©   (2011-02-22 17:12) [12]

> но эта тема как то освещена не полностью
она полностью освещена в выдержке из их хелпа буквально постом выше.
верить ему или нет это уже личное дело каждого...

> ножно, но не нужно.
и ножно и "ручно" и вообще, собственно dll в прикладных программах не то чтобы нельзя но не рекомендуется... смысла в них нет в большинстве случаев.

> можно ли в качестве аргумента в длл передавать укезатель
с общим менеджером памяти ограничений на "укезатели" нет, аналогично, что в модулях процедуры.

p.s. не там ищешь. лучше бы для начала "причесал" свой код, а не на сторонний продукт пытался "свалить".


 
Palladin ©   (2011-02-22 18:15) [13]

что бы причесывать, нужно что бы расческа работала )


 
_Юрий   (2011-02-22 19:24) [14]


> sniknik ©   (22.02.11 01:28) [10]


> and supports shared memory without the use of external .
> DLL
> files.


Не очень понятно, как такое может быть в принципе, как физически устроено, ну да ладно, написанному верить.


> Alex_C   (22.02.11 16:49) [11]


> Т.е. не сказано, что нельзя, но и не рекомендуется.


Правильно не рекомендуется. Это сразу делает невозможным использование библиотеки с приложением, написанным не на Delphi (а также может привести к проблемам, если версии Delphi разные), кроме того добавляет геморроя с менеджером памяти.
Проще передать PChar


> можно ли в качестве аргумента в длл передавать укезатель
> допустим на StringList (procedure P(var S: TStringList)?
>
>


Можно, но не нужно.

TStringList в библиготеке и TStringList в хосте - это два разных класса.

(s is TStringList) в библиотеке вернет False на переданный из хоста указатель, потому что адреса VMT у них разные.
По расположению в памяти эти два класса (класс в хосте и класс в библиотеке) могут быть идентичными. А могут и не быть - если например выставлены разные опции выравнивания.
То есть заработать такая конструкция может, но гарантировать ее работу в дальнейшем нельзя.


 
_Юрий   (2011-02-22 19:27) [15]


> Проще передать PChar
>


А еще проще - WideString


 
sniknik ©   (2011-02-22 19:32) [16]

> А еще проще - WideString
не, ну нафиг... так вы еще и до com объектов дойдете, которые тоже типа dll...


 
Alex_C   (2011-02-23 12:05) [17]


> p.s. не там ищешь. лучше бы для начала "причесал" свой код,
>  а не на сторонний продукт пытался "свалить".


Честно говоря не очень понял, почему я по твоему пытаюсь что то на кого то свалить. Я всего лишь пытаюсь разобраться в тонкостях использования длл...
А на счет причесать код - а зачем по твоему я сюда пишу? Именно для того, чтоб услышать здесь советы - форум для начинающих.


> TStringList в библиготеке и TStringList в хосте - это два
> разных класса.


Да это я уже понял.
Вот только получается такой момент:
есть необходимость использовать длл, чтобы не перекомпилить весь проект - вроде как раз именно для чего длл и предназначена, но вот проблем с ее использованием тоже много получается - нет той гибкости в использовании, которая есть при написании дополнительных ф-ций в самой программе.
Вот думаю: имеет все же смысл в использовании длл...


 
sniknik ©   (2011-02-23 12:34) [18]

> а зачем по твоему я сюда пишу?
не знаю, но точно не для того улучшить/исправить свой код... которого то тут и нет.

> есть необходимость использовать длл, чтобы не перекомпилить весь проект
сколько часов у тебя компилируется весь проект? и сколько ты выгадываешь от раздельной компиляции программы и dll?

кстати ты не в курсе, что каждый модуль (dcu) тоже не компилируется каждый раз... только при билде. а подключать модуль к проекту не в пример проще dll (не то чтобы dll сложно, но в сравнении с модулем "небо и земля").
и кстати почему не bpl? тоже раздельно компилируются.

p.s. пример бессмысленности... не целевого использования dll.
> Вот думаю: имеет все же смысл в использовании длл...
нет.


 
sniknik ©   (2011-02-23 12:38) [19]

> вроде как раз именно для чего длл и предназначена
как раз и нет, вовсе не для этого. они для использования кода/ресурсов во многих программах. связка из 1 программы с dll только под нее смысла не имеет.


 
sniknik ©   (2011-02-23 12:40) [20]

+ да, да, есть и исключения, например хуки. но в 99,8% ...


 
clickmaker ©   (2011-02-23 14:05) [21]

> связка из 1 программы с dll только под нее смысла не имеет

имеет.
- dll написана на другом языке
- dll - plugin
- dll - необязательный модуль, за счет чего можно уменьшить размер бинарников
- локализация


 
sniknik ©   (2011-02-23 14:35) [22]

> имеет.
> ...
> + да, да, есть и исключения, например хуки. но в 99,8% ...
уточнение только, проценты не от количества вариантов, а от количества попыток "ее туда встромить" в сравнении с целесообразностью.


 
Alex_C   (2011-02-23 18:08) [23]


> не целевого использования dll.


Не надо быть столь категоричним, не зная что за проект :)


> - dll - plugin


Вот в моем проекте - dll это типа плагин.
Опишу сам проект: это программа для радиолюбителей (смею заметить - я не профессиональный программист, а любитель). Проект который я виду - достаточно большой. Сейчас я в него ввожу работу в радиолюбительских соревнованиях. Соревнований просто безчисленное множество, с разными правилами. И вот как раз в DLL я предполагаю использовать для каждого соревнования. Вводить конечно можно и в основной код, но как мне кажется DLL в данном случае удобнее.
Но есть одно но: практически все ф-ции которые должны быть в DLL или в качестве аргумента, или в качестве результата имеют тип String.
Вот и получается что не очень удобно использовать DLL.


 
_Юрий   (2011-02-23 23:06) [24]

Если набор плагинов всегда одинаковый во всех установках, то DLL не нужна, лучше ту же самую плагинную архитектуру реализовать классами в единой сборке.

Если же набор плагинов у разных клиентов может быть разным, то никаких проблем на самом деле нет, строковые данные легко передаются в DLL и обратно хоть с общим менеджером памяти, хоть без - просто нужно четко понимать, как это работает.
Есть еще вариант bpl вместо dll, тогда не только строки, а даже объекты можно передавать, при соблюдении определенных условий


 
Игорь Шевченко ©   (2011-02-23 23:17) [25]


> Есть еще вариант bpl вместо dll, тогда не только строки,
>  а даже объекты можно передавать, при соблюдении определенных
> условий


можно и не соблюдать


 
Amoeba_   (2011-02-23 23:25) [26]


> в моем проекте - dll это типа плагин.

Статьи по сабжу найдешь здесь:
http://www.delphikingdom.com/
http://www.gunsmoker.ru/2008/12/1.html?showComment=1228321950846



Страницы: 1 вся ветка

Текущий архив: 2011.06.05;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.008 c
2-1298584745
Артём
2011-02-25 00:59
2011.06.05
Деление строки


2-1298609942
maxefficiently
2011-02-25 07:59
2011.06.05
RAR Component


15-1296771492
xayam
2011-02-04 01:18
2011.06.05
Какая у Вас группа крови?


3-1260280989
noob_one
2009-12-08 17:03
2011.06.05
Где хранятся домены в Interbase 7.5 ?


1-1255714707
Critical Section
2009-10-16 21:38
2011.06.05
Как правильно использовать Mutex как замену Critical Section?