powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi & Dll
21 сообщений из 21, страница 1 из 1
Delphi & Dll
    #32257761
Lt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lt
Гость
Подскажите кто знает в чем может быть дело:
Dll загружается динамически, все функции выпоняются но при вызове
FreeLibrary - ошибка что-то вроде AV только страшнее
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257763
Andreww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Память внутри DLL получаешь (GetMem или New) или освобождаешь (FreeMem, Dispose ) ?

Может внутри DLL объекты создаешь ?
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257767
Lt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lt
Гость
Внутри вообще создается форма и т.д.
Но даже с одной функцией возвращаюшей строку(болше ничего нет) происходит такая беда
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257776
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то с наследниками TForm в DLL все нетривиально. Лучше не используй это, иначе глюков и багов будет хватать.
А стринги просто в DLL нельзя передавать. Только pchar или pwidechar.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257781
Andreww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем ясно, все через это прошли :)

Расказывать долго, лучше смотри -
www.codexterity.com/memmgr.htm.

Форма это тоже объект есс-но.

А string в DLL передавать и возврашать нельзя.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257898
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну стринги передавать можно... надо только аккуратно передавать
а чтоб траблов не было то лучше PChar это верно.
равно как и работать с объектами можно
даже если создан в exe, а используется в dll. только не все такое выдерживают...
а создавать юзать и уничтожать все в одной dll так это запросто, никаких проблем
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257948
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
>> А string в DLL передавать и возврашать нельзя.

Можно ссылку на документацию?


Передавать можно все, что угодно. Но, то, что не имеет явного create (string, например), передавать можно только для чтения.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257949
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего в Dll некоректно уничтожается форма. Я через это тоже прошёл на Билдере.
Для устранения этой проблемы соэдай в Dll функцию (например EndWork), следующего содержания
Код: plaintext
1.
2.
3.
{
 delete fmMyForm;
 fmMyForm = NULL; // Без этой строчки та же проблема, а с ней нет.
}

По окончании работы с Dll, сначала вызывай EndWork, и только потом FreeLibrary.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32257954
Фотография Zmeishe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается передачи string, то действительно есть ограничения. Рекомендуется для корректной передачи включить в Dll библиотеку(lib) менеджера памяти. Но у меня и с ним некорректно работало. Поэтому использую только указатель char*.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258033
Andreww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To eNose :


В принципе, передать "только для чтения" конечно можно ( это я погорячился забыв к НЕЛЬЗЯ добавить ИМХО :) ) но дальше с String-ом нужно быть предельно аккуратным : никаких глобальных переменных типа String, никаких указателей и прочее т.е. максимум чего можно, это конвертнуть во что-то и использовать это значение или передать дальше строку (например текст у компонента поменять).

Был неприятный опыт : при написании пары библиотек использовал String-и, есс-но ничего не менял в переданых параметрах, падало только в путь, причём в самых неожиданных местах, даже использование менеджера борландовского не помогало, перешел на PCHAR, стало работать как часы, и до сих пор работает, ни одного падения.

ИМХО (теперь вроде не забыл :) ) у String-a из Delphi очень своеобразный механизм создания\удаления (для наибольшей скорости наверное), который конкретно корёжит кучу при использовании String внутри DLL.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258068
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
>> у String-a из Delphi очень своеобразный механизм создания\удаления (для наибольшей скорости наверное)

String - на самом деле объект. Просто он создается и уничтожается неявно. Со всеми вытекающими последствиями...
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258186
Andreww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To eNose :

>> String - на самом деле объект.

Не думаю что это объект вы путаете с С++, вот там действительно объект со всеми вытекающими , скорее всего указатель на структуру, след вида :

StrRec = packed record
refCnt: Longint;
length: Longint;
end;

Есс-но ни конструктора ни деструктора у него нет, и это не потомок TObject.

После refCnt и length в памяти хранятся собственно символы по одному или по два байта зависит от того WideString или AnsiString.

Поэтому быстро срабатывают присвоения типа MyStr := '' и экономится память за счёт ссылок. Память под символы выделяется динамически.

Скорее всего (не забуду добавить ИМХО :)) в DLL крышу срывает у механизма посчёта ссылок который неккоректно отслеживает присвоения и потерю области видимости внутри DLL, для этого не обязательно изменять строку, достаточно нескольких присвоений.

Описание структуры и операции со строками (типа _LStrClr, _LStrAsg и т.д.) есть в исходниках RTL в System.pas, убедитесь сами.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258269
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не думаю что это объект вы путаете с С++, вот там действительно объект со всеми вытекающими , скорее всего указатель на структуру....

Не думаю, что eNose что-то путает, непохоже на него. Разве "объект" - это не есть тоже указатель на структуру (из полей, указателей на методы, etc) с автоматичеким управлением занимаемой памяти менеджером памяти как и в случае со стрингом? В любом случае, это вопрос терминологии, а потому правых здесь быть не может.

Есс-но ни конструктора ни деструктора у него нет, и это не потомок TObject.

Наличие деструктора-конструктора и наследование от TObject не является определением объекта.

Скорее всего (не забуду добавить ИМХО :)) в DLL крышу срывает у механизма посчёта ссылок который неккоректно отслеживает присвоения и потерю области видимости внутри DLL, для этого не обязательно изменять строку, достаточно нескольких присвоений.

У DLL срывает крышу по очень простой причине. В каждом модуле, EXE это или DLL - свой собственный менеджер памяти, а потому в параметры нельзя передавать объекты (в широком смысле, в том числе и стринги, и варианты, и дин. массивы), у которых память автоматически управляется менеджером.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258343
Andreww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258426
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
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 что-то путает, непохоже на него.
Где тут нимбы раздают?
Ошибаюсь. А кто не ошибается? Только тот, кто ничего не делает.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258478
Andreww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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, так проще и не придётся выдумывать "недообъекты" и алхимический конструктор\деструктор.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258495
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Andreww, почитай внимательно вот это:


Стив Тейксейра и Савье Пачеко

Delphi 5: руководство разработчика

Том 1. Страницы 68 - 72.



------------------------------------------------------------
Ты вообще чем в споре руководствуешья? Собственным опытом? Или документацией?
...
Рейтинг: 0 / 0
Delphi & Dll
    #32258536
Andreww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ээээ. Можно ссылочку, плиззз.

Или если такой нету, привести краткое содержание этих страниц.

Я последний раз рускоязычную литературу по Delphi открывал ещё во времена 3 версии.

Из-за 5 страниц покупать целый том, пока его привезут, там поди страниц 600, не меньше :(

Руководствуюсь есс-но документацией и опытом, ещё исходными кодами которые доступны.

Насколько я понимаю (могу ошибатся конечно) , но Стив Тейксейра и Савье Пачеко
это не официальное руководство от Borland, а вот исходники RTL это работающая библиотека.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32277431
Lt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lt
Гость
Спасибо всем за проявленный интерес!!!!
С Dll -ю я разобрался. Глючила там конечно-же форма -
ее я теперь создаю из Dll и владельца указываю как Application в dll
Насчет передачи string - можно передавать string[] or Pchar or array[] of char
- это точно, правда если написать stdcall - символы будут заменены на какую-то херню (наверное просто перекодированы)
...
Рейтинг: 0 / 0
Delphi & Dll
    #32278031
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я понимаю, кроме как PChar, строки еще можно передавать как ShortString.
...
Рейтинг: 0 / 0
Delphi & Dll
    #32279182
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не перекодированы, а прочтены бог знает откуда...
соглашение о выховах надо ставить одинаковое в обоих случаях
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi & Dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]