Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Подскажите кто знает в чем может быть дело: Dll загружается динамически, все функции выпоняются но при вызове FreeLibrary - ошибка что-то вроде AV только страшнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2003, 23:30 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Память внутри DLL получаешь (GetMem или New) или освобождаешь (FreeMem, Dispose ) ? Может внутри DLL объекты создаешь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2003, 00:39 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Внутри вообще создается форма и т.д. Но даже с одной функцией возвращаюшей строку(болше ничего нет) происходит такая беда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2003, 05:41 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Вообще-то с наследниками TForm в DLL все нетривиально. Лучше не используй это, иначе глюков и багов будет хватать. А стринги просто в DLL нельзя передавать. Только pchar или pwidechar. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2003, 10:55 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Вобщем ясно, все через это прошли :) Расказывать долго, лучше смотри - www.codexterity.com/memmgr.htm. Форма это тоже объект есс-но. А string в DLL передавать и возврашать нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2003, 11:15 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
ну стринги передавать можно... надо только аккуратно передавать а чтоб траблов не было то лучше PChar это верно. равно как и работать с объектами можно даже если создан в exe, а используется в dll. только не все такое выдерживают... а создавать юзать и уничтожать все в одной dll так это запросто, никаких проблем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 03:58 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
>> А string в DLL передавать и возврашать нельзя. Можно ссылку на документацию? Передавать можно все, что угодно. Но, то, что не имеет явного create (string, например), передавать можно только для чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 08:15 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Скорее всего в Dll некоректно уничтожается форма. Я через это тоже прошёл на Билдере. Для устранения этой проблемы соэдай в Dll функцию (например EndWork), следующего содержания Код: plaintext 1. 2. 3. По окончании работы с Dll, сначала вызывай EndWork, и только потом FreeLibrary. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 08:21 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Что касается передачи string, то действительно есть ограничения. Рекомендуется для корректной передачи включить в Dll библиотеку(lib) менеджера памяти. Но у меня и с ним некорректно работало. Поэтому использую только указатель char*. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 08:33 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
To eNose : В принципе, передать "только для чтения" конечно можно ( это я погорячился забыв к НЕЛЬЗЯ добавить ИМХО :) ) но дальше с String-ом нужно быть предельно аккуратным : никаких глобальных переменных типа String, никаких указателей и прочее т.е. максимум чего можно, это конвертнуть во что-то и использовать это значение или передать дальше строку (например текст у компонента поменять). Был неприятный опыт : при написании пары библиотек использовал String-и, есс-но ничего не менял в переданых параметрах, падало только в путь, причём в самых неожиданных местах, даже использование менеджера борландовского не помогало, перешел на PCHAR, стало работать как часы, и до сих пор работает, ни одного падения. ИМХО (теперь вроде не забыл :) ) у String-a из Delphi очень своеобразный механизм создания\удаления (для наибольшей скорости наверное), который конкретно корёжит кучу при использовании String внутри DLL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 10:20 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
>> у String-a из Delphi очень своеобразный механизм создания\удаления (для наибольшей скорости наверное) String - на самом деле объект. Просто он создается и уничтожается неявно. Со всеми вытекающими последствиями... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 10:40 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
To eNose : >> String - на самом деле объект. Не думаю что это объект вы путаете с С++, вот там действительно объект со всеми вытекающими , скорее всего указатель на структуру, след вида : StrRec = packed record refCnt: Longint; length: Longint; end; Есс-но ни конструктора ни деструктора у него нет, и это не потомок TObject. После refCnt и length в памяти хранятся собственно символы по одному или по два байта зависит от того WideString или AnsiString. Поэтому быстро срабатывают присвоения типа MyStr := '' и экономится память за счёт ссылок. Память под символы выделяется динамически. Скорее всего (не забуду добавить ИМХО :)) в DLL крышу срывает у механизма посчёта ссылок который неккоректно отслеживает присвоения и потерю области видимости внутри DLL, для этого не обязательно изменять строку, достаточно нескольких присвоений. Описание структуры и операции со строками (типа _LStrClr, _LStrAsg и т.д.) есть в исходниках RTL в System.pas, убедитесь сами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 11:41 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Не думаю что это объект вы путаете с С++, вот там действительно объект со всеми вытекающими , скорее всего указатель на структуру.... Не думаю, что eNose что-то путает, непохоже на него. Разве "объект" - это не есть тоже указатель на структуру (из полей, указателей на методы, etc) с автоматичеким управлением занимаемой памяти менеджером памяти как и в случае со стрингом? В любом случае, это вопрос терминологии, а потому правых здесь быть не может. Есс-но ни конструктора ни деструктора у него нет, и это не потомок TObject. Наличие деструктора-конструктора и наследование от TObject не является определением объекта. Скорее всего (не забуду добавить ИМХО :)) в DLL крышу срывает у механизма посчёта ссылок который неккоректно отслеживает присвоения и потерю области видимости внутри DLL, для этого не обязательно изменять строку, достаточно нескольких присвоений. У DLL срывает крышу по очень простой причине. В каждом модуле, EXE это или DLL - свой собственный менеджер памяти, а потому в параметры нельзя передавать объекты (в широком смысле, в том числе и стринги, и варианты, и дин. массивы), у которых память автоматически управляется менеджером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 12:16 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
To Dankov : >> Не думаю, что eNose что-то путает, непохоже на него. Никогда не ошибается ? :-O Правда ? >>Разве "объект" - это не есть тоже указатель на структуру (из полей, указателей на методы, etc) с автоматичеким управлением занимаемой памяти менеджером памяти как и в случае со стрингом? Вобщем да. Безусловно. Если попытаться дать определение объекту, то рано или поздно скатимся в мощный флейм - можно объявить ещё массив указателей и сказать что указатель на это массив - объект, можно попросить добавить метод в структуру, можно попробовать привести пример наследования от структуры и прочее. А кто-нибудь скажет, что наследование в ООП не обязательно, появится какой-нибудь Troll который вякнет C++ Rulezzz Delphi Suxx и понеслась ! Ни к чему хорошему это не приведёт. Если хватит сил и вежливости :), придём к выводу, что всё что определяется как Var ptr:Pointer это объект. Поэтому это действительно спор терминологии и правых тут нет. Не очень правда ясно что значит "автоматичеким управлением занимаемой памяти ", ИМХО, все что получено через GetMem и вся память занимаемая объектами созданными через кончтруктор будет управлятся менеджером, разве нет ? >>Наличие деструктора-конструктора и наследование от TObject не является определением объекта. Конечно не является, кто с этим спорит ? Я вроде так его и не определял. Просто eNose отметил >>Просто он создается и уничтожается неявно. Со всеми вытекающими последствиями... Если это String объект и он создается и уничтожается (пусть неявно) у него должен быть конструктор и деструктор, свой или унаследованый от TObject (мы всё-таки говорим о Delphi у которой все наследуется от TObject верно ?). Если под классом имеется ввиду любой указатель на структуру - тогда прощу прощения за терминологическую путаницу. >>В каждом модуле, EXE это или DLL - свой собственный менеджер памяти, Точнее экземпляр кучи у каждого свой, отсюда и путаница. >>потому в параметры нельзя передавать объекты (в широком смысле, в том >>числе и стринги, и варианты, и дин. массивы), Но менеджер памяти устроен так, что передавать, что угодно можно, менять нельзя, об этом и говорил eNose, я же заметил, что String это структура (если угодно объект), содержимое которой будет менятся при присвоении, например. >> у которых память автоматически управляется менеджером. Опять-таки, всё управляется менеджером, если вы только не не используйте менеджер Windows или не выделяете память напрямую через вызовы WinAPI. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 12:53 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
2 Andreww: Не думаю что это объект вы путаете с С++, вот там действительно объект со всеми вытекающими , скорее всего указатель на структуру, след вида : StrRec = packed record refCnt: Longint; length: Longint; end; Есс-но ни конструктора ни деструктора у него нет, и это не потомок TObject. Скажем так: не совсем объект в терминологии Делфи, а "тип с управляемым временем жизни", или lifetime-managed, как его обзывает Borland. Конкструктора/деструктора у него, естественно, нет (явного), но каждый раз (при изменении строки) происходит выделение памяти. А для уничтожения этого типа рименяется технология garbage collect. Вот еще такие же типы: Variant, OleVariant, Interface, dispinterface, WideString. Внутренняя структура типа string не документированна. Скорее всего (не забуду добавить ИМХО :)) в DLL крышу срывает у механизма посчёта ссылок который неккоректно отслеживает присвоения и потерю области видимости внутри DLL, для этого не обязательно изменять строку, достаточно нескольких присвоений. Нет. Типом String управляет процесс, его создавший. При передачи указателя в dll, а затем при попытке изменить содержимое, возникает самый обыкновенный AV, так как dll пытается обратиться к адресу (функции выделения памяти) чужого процесса. Описание структуры и операции со строками (типа _LStrClr, _LStrAsg и т.д.) есть в исходниках RTL в System.pas, убедитесь сами. А можно и документацию почитать по типам в Делфи. Никогда не ошибается ? :-O Ошибаюсь. Как и все Если это String объект и он создается и уничтожается (пусть неявно) у него должен быть конструктор и деструктор, свой или унаследованый от TObject (мы всё-таки говорим о Delphi у которой все наследуется от TObject верно ?). Совсем не обязательно иметь конструктор/деструктор, описанный в *.pas. Они на самом деле есть. Менеджер памяти этим и занимается - инициализирует и уничтожает. Непривычный способ, но зато совместимость с 16-ти разрядным кодом выдержана наиболее полно (насколько это возможно). Под словом "объект" я подразумевал нечто более широкое, чем TObject в Делфи. Но менеджер памяти устроен так, что передавать, что угодно можно, менять нельзя, об этом и говорил eNose, я же заметил, что String это структура (если угодно объект), содержимое которой будет менятся при присвоении, например. Вот мы пришли к общему мнению. 2 Dankov: Не думаю, что eNose что-то путает, непохоже на него. Где тут нимбы раздают? Ошибаюсь. А кто не ошибается? Только тот, кто ничего не делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 13:29 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
To eNose >>Скажем так: не совсем объект в терминологии Делфи, а "тип с управляемым временем жизни", или lifetime-managed, как его обзывает Borland. Конкструктора/деструктора у него, естественно, нет (явного), но каждый раз (при изменении строки) происходит выделение памяти. А для уничтожения этого типа рименяется технология garbage collect. Это не совсем объект (тут действительно путаница) но lifetime-managed и GC это два РАЗНЫХ понятия, и уничтожение lifetime-managed объекта, происходит тогда, когда у него заканчивается время жизни (из названия видно) а GC убирает мусор при некоторых условиях, например refcounting GC из Java 1 и GC из Java 2 основаный на достижимости убирают мусор когда объём доступной памяти опускается ниже некоторой отметки. Никаких GC в Delphi нету lifetime-managed объект удаляется СРАЗУ по окончании своей жизни (в случае string когда счётчик ссылок становится равным 0) и менеджер памяти не отслеживает его состоянии (в отличии, например, от Java GC). >>Вот еще такие же типы: Variant, OleVariant, Interface, dispinterface, WideString. WideString это почти String, отличия незначительны :) >>Никогда не ошибается ? :-O >Ошибаюсь. Как и все. Похоже на то. Попробую описать ниже, в чём ошибка. >>Типом String управляет процесс, его создавший. Управляет менеджер кучи который часть создавшего процесса. >>При передачи указателя в dll, а затем при попытке изменить содержимое, >>возникает самый обыкновенный AV, так как dll пытается обратиться к адресу >>(функции выделения памяти) чужого процесса. При загрузке DLL не порождается новый процесс ! Ни в коем случае ! Новый процесс порождается фунуцией CreateProcess, а поток CreateThread , DLL тут никаким боком не учавствует. DLL - это набор функций и данных которые можно подключить к ИСПОЛНЯЮЩЕМУСЯ процессу\потоку. И передать в неё указатель можно, запросто, и работать с ним можно, и даже менять его можно (правда уже не так просто). >>Совсем не обязательно иметь конструктор/деструктор, описанный в *.pas. Этого высказывания я не понял. Совсем. >>Они на самом деле есть. Где ? Если в system.pas (Ansi,Wide,Long)String определены как указатель на структуру, когда и кем в неё добавляется указатель на конструктор\деструктор ? Колдовство ? ;) >>Менеджер памяти этим и занимается - инициализирует и уничтожает. Конечно. Это его основная задача. >>Под словом "объект" я подразумевал нечто более широкое, чем TObject в Делфи. Теперь понятно. Я подразумевал именно объект как наследник TObject. Рад, что мы поняли друг-друга. >>Описание структуры и операции со строками (типа _LStrClr, _LStrAsg и т.д.) >>есть в исходниках RTL в System.pas, убедитесь сами. >>А можно и документацию почитать по типам в Делфи. Можно, но только внутренне устройстово типа String (а также WideString, LongString) не описано в документации, его ясно можно представить только анализируя исходники RTL, так проще и не придётся выдумывать "недообъекты" и алхимический конструктор\деструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 14:06 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Andreww, почитай внимательно вот это: Стив Тейксейра и Савье Пачеко Delphi 5: руководство разработчика Том 1. Страницы 68 - 72. ------------------------------------------------------------ Ты вообще чем в споре руководствуешья? Собственным опытом? Или документацией? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 14:14 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Ээээ. Можно ссылочку, плиззз. Или если такой нету, привести краткое содержание этих страниц. Я последний раз рускоязычную литературу по Delphi открывал ещё во времена 3 версии. Из-за 5 страниц покупать целый том, пока его привезут, там поди страниц 600, не меньше :( Руководствуюсь есс-но документацией и опытом, ещё исходными кодами которые доступны. Насколько я понимаю (могу ошибатся конечно) , но Стив Тейксейра и Савье Пачеко это не официальное руководство от Borland, а вот исходники RTL это работающая библиотека. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2003, 14:32 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за проявленный интерес!!!! С Dll -ю я разобрался. Глючила там конечно-же форма - ее я теперь создаю из Dll и владельца указываю как Application в dll Насчет передачи string - можно передавать string[] or Pchar or array[] of char - это точно, правда если написать stdcall - символы будут заменены на какую-то херню (наверное просто перекодированы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2003, 10:12 |
|
||
|
Delphi & Dll
|
|||
|---|---|---|---|
|
#18+
Насколько я понимаю, кроме как PChar, строки еще можно передавать как ShortString. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2003, 11:50 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32257761&tid=2116680]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
62ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
79ms |
get tp. blocked users: |
2ms |
| others: | 263ms |
| total: | 460ms |

| 0 / 0 |
