Форум: "Начинающим";
Текущий архив: 2011.06.05;
Скачать: [xml.tar.bz2];
ВнизОшибка при 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c