![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при FreeLibrary [D7, XP]
Alex_C © (2011-02-21 18:49:00)ПРи попытке FreeLibrary(MyDLL) появляется сообщение об ошибке доступа. Использую FastMM (В uses указана первой и в программе, и в dpr dll). Причем ошибка возникает не сразу, при вызове из программы FreeLibrary (я это делаю при Destroy основного приложения), а уже в момент самого закрытия приложения. Не могу понять причину.
Amoeba_ (2011-02-23 23:25:00) [1]
> в моем проекте - dll это типа плагин.
Статьи по сабжу найдешь здесь:
http://www.delphikingdom.com/
http://www.gunsmoker.ru/2008/12/1.html?showComment=1228321950846
Игорь Шевченко (2011-02-23 23:17:00) [2]
> Есть еще вариант bpl вместо dll, тогда не только строки,
> а даже объекты можно передавать, при соблюдении определенных
> условий
можно и не соблюдать
_Юрий (2011-02-23 23:06:00) [3]Если набор плагинов всегда одинаковый во всех установках, то DLL не нужна, лучше ту же самую плагинную архитектуру реализовать классами в единой сборке.
Если же набор плагинов у разных клиентов может быть разным, то никаких проблем на самом деле нет, строковые данные легко передаются в DLL и обратно хоть с общим менеджером памяти, хоть без - просто нужно четко понимать, как это работает.
Есть еще вариант bpl вместо dll, тогда не только строки, а даже объекты можно передавать, при соблюдении определенных условий
Alex_C (2011-02-23 18:08:00) [4]
> не целевого использования dll.
Не надо быть столь категоричним, не зная что за проект :)
> - dll - plugin
Вот в моем проекте - dll это типа плагин.
Опишу сам проект: это программа для радиолюбителей (смею заметить - я не профессиональный программист, а любитель). Проект который я виду - достаточно большой. Сейчас я в него ввожу работу в радиолюбительских соревнованиях. Соревнований просто безчисленное множество, с разными правилами. И вот как раз в DLL я предполагаю использовать для каждого соревнования. Вводить конечно можно и в основной код, но как мне кажется DLL в данном случае удобнее.
Но есть одно но: практически все ф-ции которые должны быть в DLL или в качестве аргумента, или в качестве результата имеют тип String.
Вот и получается что не очень удобно использовать DLL.
sniknik (2011-02-23 14:35:00) [5]> имеет.
> ...
> + да, да, есть и исключения, например хуки. но в 99,8% ...
уточнение только, проценты не от количества вариантов, а от количества попыток "ее туда встромить" в сравнении с целесообразностью.
clickmaker (2011-02-23 14:05:00) [6]> связка из 1 программы с dll только под нее смысла не имеет
имеет.
- dll написана на другом языке
- dll - plugin
- dll - необязательный модуль, за счет чего можно уменьшить размер бинарников
- локализация
sniknik (2011-02-23 12:40:00) [7]+ да, да, есть и исключения, например хуки. но в 99,8% ...
sniknik (2011-02-23 12:38:00) [8]> вроде как раз именно для чего длл и предназначена
как раз и нет, вовсе не для этого. они для использования кода/ресурсов во многих программах. связка из 1 программы с dll только под нее смысла не имеет.
sniknik (2011-02-23 12:34:00) [9]> а зачем по твоему я сюда пишу?
не знаю, но точно не для того улучшить/исправить свойкод... которого то тут и нет.
> есть необходимость использовать длл, чтобы не перекомпилить весь проект
сколько часов у тебя компилируется весь проект? и сколько ты выгадываешь от раздельной компиляции программы и dll?
кстати ты не в курсе, что каждый модуль (dcu) тоже не компилируется каждый раз... только при билде. а подключать модуль к проекту не в пример проще dll (не то чтобы dll сложно, но в сравнении с модулем "небо и земля").
и кстати почему не bpl? тоже раздельно компилируются.
p.s. пример бессмысленности... не целевого использования dll.
> Вот думаю: имеет все же смысл в использовании длл...
нет.
Alex_C (2011-02-23 12:05:00) [10]
> p.s. не там ищешь. лучше бы для начала "причесал" свой код,
> а не на сторонний продукт пытался "свалить".
Честно говоря не очень понял, почему я по твоему пытаюсь что то на кого то свалить. Я всего лишь пытаюсь разобраться в тонкостях использования длл...
А на счет причесать код - а зачем по твоему я сюда пишу? Именно для того, чтоб услышать здесь советы - форум для начинающих.
> TStringList в библиготеке и TStringList в хосте - это два
> разных класса.
Да это я уже понял.
Вот только получается такой момент:
есть необходимость использовать длл, чтобы не перекомпилить весь проект - вроде как раз именно для чего длл и предназначена, но вот проблем с ее использованием тоже много получается - нет той гибкости в использовании, которая есть при написании дополнительных ф-ций в самой программе.
Вот думаю: имеет все же смысл в использовании длл...
sniknik (2011-02-22 19:32:00) [11]> А еще проще - WideString
не, ну нафиг... так вы еще и до com объектов дойдете, которые тоже типа dll...
_Юрий (2011-02-22 19:27:00) [12]
> Проще передать PChar
>
А еще проще - WideString
_Юрий (2011-02-22 19:24:00) [13]
> 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 у них разные.
По расположению в памяти эти два класса (класс в хосте и класс в библиотеке) могут быть идентичными. А могут и не быть - если например выставлены разные опции выравнивания.
То есть заработать такая конструкция может, но гарантировать ее работу в дальнейшем нельзя.
Palladin (2011-02-22 18:15:00) [14]что бы причесывать, нужно что бы расческа работала )
sniknik (2011-02-22 17:12:00) [15]> но эта тема как то освещена не полностью
она полностью освещена в выдержке из их хелпа буквально постом выше.
верить ему или нет это уже личное дело каждого...
> ножно, но не нужно.
и ножно и "ручно" и вообще, собственно dll в прикладных программах не то чтобы нельзя но не рекомендуется... смысла в них нет в большинстве случаев.
> можно ли в качестве аргумента в длл передавать укезатель
с общим менеджером памяти ограничений на "укезатели" нет, аналогично, что в модулях процедуры.
p.s. не там ищешь. лучше бы для начала "причесал" свой код, а не на сторонний продукт пытался "свалить".
Alex_C (2011-02-22 16:49:00) [16]
> В программе - где именно?
В dpr-файле.
Вообще уважаемые гуру, объясните мне по длл следующее (прочитал много статей, но эта тема как то освещена не полностью): можно ли в качестве аргумента и результата ф-ции использовать string, если в качестве менеджера памяти используется FastMM?
Везде, где я читал, как то странно сказано: ножно, но не нужно. Т.е. не сказано, что нельзя, но и не рекомендуется.
Второе: можно ли в качестве аргумента в длл передавать укезатель допустим на StringList (procedure P(var S: TStringList)?
sniknik (2011-02-22 01:28:00) [17]> Разве 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.
_Юрий (2011-02-22 00:23:00) [18]
> sniknik © (21.02.11 21:13) [5]
> на то и используется общий менеджер памяти чтобы можно было
> передавать, и не заботится.
Разве FastMM может использоваться как внешний?
Игорь Шевченко (2011-02-21 23:11:00) [19]предлагаю ветку закрыть, а автора забанить
RWolf (2011-02-21 23:02:00) [20]
> в программе
в DLL, конечно.