![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделение PChar
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.