![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделение и освобождение памяти под PChar [D5]
Zn © (2002-11-14 10:31:00)Help me, please! Как корректно выделить и освободить память под PChar? Объем заранее неизвестен. Простите за тривиальный вопрос...
Alx2 (2002-11-14 14:05:00) [1]>Zn (14.11.02 14:01)
>Пытался вставлять в объявления stdcall, pascal или register -
>безрезультатно.
Главное, чтобы в хосте и в dll спецификаторы вызова (stdcall, pascal или register) совпадали.
На всякий случай воткни в секцию uses модуль sharemem на первое место в dpr файле и в головном файле библиотеке. Из других мест (если есть) его выкинь.
PS
Вообще говоря, вслепую проблематично дебагить :)
Zn (2002-11-14 14:01:00) [2]>Alx2 © (14.11.02 13:04)
>как полностью объявлена ф-я в dll и как в родительской программе?
Идентично.
function U866(var InpStr: PChar): PChar;
Пытался вставлять в объявления stdcall, pascal или register - безрезультатно.
Alx2 (2002-11-14 13:04:00) [3]>Zn (14.11.02 12:34)
как полностью объявлена ф-я в dll и как в родительской программе?
Zn (2002-11-14 12:34:00) [4]Alx2! Ваш код работает отлично, но на последне строке функции (end;) выдает "Invalid pointer operation". Хотя дальше возвращаемое значение садится куда надо и родительская программа продолжает работать.
Zn (2002-11-14 11:36:00) [5]Alx2 и icWasya! Благодарю за подсказку, сейчас попробую!
Alx2 (2002-11-14 11:36:00) [6]>Zn (14.11.02 11:33)
>Это я пробовал. Не работает.
А мои посты тебе ничего не рассказали?
Zn (2002-11-14 11:33:00) [7]<слепой вася спокойно передает в дельфи строку:
<declare function myfunc (byval st as string) as string
<теперь в длл спокойно пишем:
<function U866(var InpStr: string): PChar;
<работаем с какой-либо внутренней переменно типа string, а в <конце функции пишем:
<result:=pchar(IntrStr);
<во всяком случае для ворд васика прокатит.
Это я пробовал. Не работает.
icWasya (2002-11-14 11:27:00) [8]Если посмотришь описание Windows процедур, которые используют PChar, то увидишь, что если процедура возвращает строку то она имеет приблизительно такое описание:
integer GetAnyThing(Buf:PChar;integer LenBuf);
то есть вызывающая программа заказывает массив под возвращаемую строку и передаёт процедуре размер массива и указатель на него,
а возвращает реальный размер записанных данных.
в данном случае код должен быть примерно таким:
function U866(InpStr: PChar;OutStr: PChar;OutLen:Integer):PChar;
var i,z : Word;
s: Char;
ps: PChar;
begin
i:=0;z:=0;
Result:=OutStr;
ps:=OutStr;
while InpStr[i]<>#0 do
begin
s:=InpStr[i];
case s of
"в": s:="|";
"б": s:="
Ru (2002-11-14 11:26:00) [9]>Zn (14.11.02 11:12)
слепой вася спокойно передает в дельфи строку:
declare function myfunc (byval st as string) as string
теперь в длл спокойно пишем:
function U866(var InpStr: string): PChar;
работаем с какой-либо внутренней переменно типа string, а в конце функции пишем:
result:=pchar(IntrStr);
во всяком случае для ворд васика прокатит.
Alx2 (2002-11-14 11:24:00) [10]>Alx2 © (14.11.02 11:22)
Кстати, InpStr=Result после отработки ф-ии
Reindeer Moss Eater (2002-11-14 11:23:00) [11]Dispose(ps) - это убиение строки, которую ты так заботливо собирал внутри функции
Alx2 (2002-11-14 11:22:00) [12]>Zn (14.11.02 11:12)
>Всё это будет сидеть DLL. Просто нужно перекодировать некоторые
>символы. Функцию будут использовать приложения Delphi и VB.
Просто перекодируем тогда по твоим мотивам:
Function U866(Const InpStr: PChar): PChar;
Var I : Integer;
Begin
Result := InpStr;
For I := 0 To StrLen(InpStr) - 1 Do
Case InpStr[I] Of
"в": Result[I] := "
Zn (2002-11-14 11:21:00) [13]>Reindeer Moss Eater (14.11.02 11:13)
>Так ты вернул PChar, а потом освободил память, не которую он >указывал.
Т.е.? Освободил память под локальную переменную, которая, в принципе, и сама бы должна. А я для перестраховки. Просто с указателями не очень дружу.
Reindeer Moss Eater (2002-11-14 11:13:00) [14]Так ты вернул PChar, а потом освободил память, не которую он указывал.
Zn (2002-11-14 11:12:00) [15]Всё это будет сидеть DLL. Просто нужно перекодировать некоторые символы. Функцию будут использовать приложения Delphi и VB.
Skier (2002-11-14 11:12:00) [16]>Zn
> Как корректно выделить и освободить память под PChar? Объем
> заранее неизвестен
Ну ежели объём заранее неизвестен, то можно просто кастингом
Что то типа :
APCharVar := PChar(AStringVar);
А вообще при выделении и освобождении памяти спасает
AllocMem(...) и FreeMem(...)
Reindeer Moss Eater (2002-11-14 11:11:00) [17]Так ты вернул PChar, а потом освободил память, не которую он указывал.
Alx2 (2002-11-14 11:10:00) [18]>Zn (14.11.02 10:56)
Извини, но это бред.
Ты хочешь конвертер OemToAnsi написать?
Calm (2002-11-14 11:08:00) [19]Zn, страшные вещи пишите :)
А что, без PChar точно нельзя?
Zn (2002-11-14 10:56:00) [20]function U866(var InpStr: PChar): PChar;
var i,z : Word;
ps: PChar;
begin
New(Result);
New(ps);
z:=Length(InpStr)-1;
for i:=0 to z do
begin
ps^:=InpStr[i];
case ps^ of
"в": Result:=strcat(Result,"