Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1297891798
Юрий
2011-02-17 00:29
2011.06.05
С днем рождения ! 17 февраля 2011 четверг


2-1298361567
viktor
2011-02-22 10:59
2011.06.05
подключение к БД используя РОЛЬ


15-1297841206
И. Павел
2011-02-16 10:26
2011.06.05
Явамастер


15-1298022283
павел
2011-02-18 12:44
2011.06.05
ограничение использования FloatToStr и ему подобных


4-1248431121
Игорь
2009-07-24 14:25
2011.06.05
Перечисление групп процесса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский