Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выделение PChar


Страницы:   1 2 3

Vga ©   (2006-12-06 11:55:00) 

Возник такой вопрос. Есть функция в DLL:
Foo(...): PChar;
1) Как выделить память для результата?
2) Надо ли выполнять дополнительные действия по ее освобождению4 если да, то где и какие, если нет - то когда она будет освобождена?


Romkin   (2006-12-06 14:09:00) [1]

Reindeer Moss Eater ©   (06.12.06 12:59) [24] F1 нажимал? Читал, что написано про StrAlloc? Только для обратной совместимости. Вместо нее давно уже ansistring тип есть.
И если ты думаешь, что выделив StrAlloc память в dll ты можешь легко освободить ее StrDispose в основном приложении - флаг в руки, барабан на шею - тоннель сам найдешь. Тут нужно использовать внешний менеджер памяти, точно как в случае с длинными строками. Со всеми вытекающими.


Vga   (2006-12-06 14:03:00) [2]

> [40] Anatoly Podgoretsky ©   (06.12.06 13:53)

Из функции (в dll) в вызывающую процедуру.


Anatoly Podgoretsky   (2006-12-06 13:53:00) [3]

> Vga  (06.12.2006 13:35:36)  [36]

Куда передать?


Vga   (2006-12-06 13:41:00) [4]

> [38] app ©   (06.12.06 13:39)

Вопрос есть, но "нужен ли PChar" - вопрос вне темы, т.к. я спрашивал именно про PChar.


app   (2006-12-06 13:39:00) [5]

Ты не понял, не физически закрыть, а по причине отсутсвия вопроса.


Vga   (2006-12-06 13:38:00) [6]

А учитывая, что ответ я получил, то можно тему и закрыть, ничего не имею против.


Vga   (2006-12-06 13:35:00) [7]

> [35] app ©   (06.12.06 13:31)

Вопрос был, как передать именно PChar, точнее, языконезависимый строковый тип. Если бы ansistring подходили всегда и везде, вопроса бы и не возникло.


app   (2006-12-06 13:31:00) [8]

Ну почему не по теме, если не нужны, то тема сразу закрывается по причине отсутствия в необходимости.

Для справки string полностью совместим с PChar


Vga   (2006-12-06 13:26:00) [9]

> [33] Anatoly Podgoretsky ©   (06.12.06 13:22)

Требуется. Но это уже не по теме.


Anatoly Podgoretsky   (2006-12-06 13:22:00) [10]

> Vga  (06.12.2006 13:11:31)  [31]

Вопрос последний, а нужен ли PChar - для Дельфи не требуется, это если только извне, вин апи, user dll


Anatoly Podgoretsky   (2006-12-06 13:21:00) [11]

> Vga  (06.12.2006 13:05:27)  [27]

Можно вызывать только один раз, выдели буфер достаточного размера.


Vga   (2006-12-06 13:11:00) [12]

> [30] Reindeer Moss Eater ©   (06.12.06 13:08)

В общем случае. А частный я не описал, да и не буду, сам уже разобрался, так что [20] надо рассматривать как частный случай решения с ограниченной применимостью. Он ведь рабочий и при соблюдении ограничений вполне корректный.


Reindeer Moss Eater   (2006-12-06 13:08:00) [13]

Склоняюсь к методу из [20]

такое же корявое решение.
DLL вернув результат не должна париться над вопросом как долго вызывающее приложение будет юзать ссылку.
А приложение не должно париться можно ли менять содержимое по ссылке и вообще как долго будет живо содержимое этого буфера.


Vga   (2006-12-06 13:07:00) [14]

> [26] Anatoly Podgoretsky ©   (06.12.06 13:04)

Вопрос довольно общий, навеяно конкретным случаем, из-за которого и возникли [20], [27], но я хотел получить информацию, которую можно использовать в других случаях, когда надо вернуть строковые данные. Такую информацию получил, спасибо всем.


DevilDevil   (2006-12-06 13:06:00) [15]


> Vga ©


А у тебя буфер переменной длинны?

Как вариант: в хедере к Dll, в implementation пусть статически будет лежать буфер. ПРи инициализации Dll, в Dll передаётся указатель на этот буфер. Соответственно, проблем с извлечением данных из буфера не будет.


Vga   (2006-12-06 13:05:00) [16]

Спасибо, свою ошибку я понял... Теперь надо думать, как реализовать... Склоняюсь к методу из [20] по причине удобства вызывающей стороны, так как результат обычно используется сразу, а если не так - можно скопировать.
Метод с передачей буфера не хотелось бы, так как функция не из быстрых, и вызывать два раза не хотелось бы...


Anatoly Podgoretsky   (2006-12-06 13:04:00) [17]

> Vga  (06.12.2006 12:58:23)  [23]

Почему бы и нет, посмотри в справке функции работы с PChar многие из них возвращают как результат. Возвращение как результат позволяет использовать эту функцию в качестве параметра другой функции.

Твой вопрос без постановки задачи ничего не стоит.
Сначала надо поставить задачу, правда тогда и вопроса не будет.


Anatoly Podgoretsky   (2006-12-06 13:00:00) [18]

> Vga  (06.12.2006 12:55:20)  [20]

Поэтому таких в АПИ считаное количество, большинство функций АПИ ни таким, ни выделением не занимается, а использует буфер пользователя. Некоторые могут сообщить, какой по размеру требуется.


Reindeer Moss Eater   (2006-12-06 12:59:00) [19]

GetMem - это функция, которая задействует Дельфийский менеджер памяти. Отсюда несовместимостьи

Это не имеет значения.

1. Функция DLL написанная нечайником, никогда не распределит память сама, а скажет какой длины буфер ей надо что бы вернуть данные.

2. Если я узнал длину буфера, и у меня скажем нет переменной string которй я могу сделать setlength, то чем таким страшным устарела страллок, если я не собираюсь передвать ссылку ни в какой другой процесс?


Vga   (2006-12-06 12:58:00) [20]

> [21] Anatoly Podgoretsky ©   (06.12.06 12:55)

Этот вариант входит в
> либо не возвращать PChar.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо