![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему так? [D6, Win2k]
Dmitriy Polskoy © (2002-10-03 12:44:00)Почему следующий код
procedure TForm1.Button1Click(Sender: TObject);
var
buf: pchar;
begin
GetMem(buf, 50);
label1.Caption := IntToStr (Sizeof(buf));
FreeMem(buf);
end;
выдает в Caption значение 4 ?
han_malign (2002-10-03 13:51:00) [1]а если нужно все таки знать размер выделенного буфера то нужно пользоваться GlobalAlloc,GlobalLock,GlobalSize
han_malign (2002-10-03 13:45:00) [2]в этом случае
procedure TForm1.Button1Click(Sender: TObject);
var
buf: pchar;
begin
GetMem(buf, 50);
label1.Caption := IntToStr (50);
FreeMem(buf);
end;
;^P
а если все же
procedure TForm1.LedPCharSize(buf: PChar);
begin
label1.Caption := IntToStr (Length(buf));//не явное преобразование PChar к String в Length()
//или
label1.Caption := IntToStr (lstrlen(buf));//явно через WinApi(uses Windows;)
end;
вот только будет не размер буфера, а позиция первого #0,
а если нуля до конца буфера не окажется - то О-О-Ой что буде-е-е-т.
З.Ы. Причем Delphi-йский GetMem память в отличии от Local/GlobalAlloc память не обнуляет, так что Access violation обеспечен.(НЕ УВЕРЕН НАДО ПРОВЕРЯТЬ)
З.З.Ы. в Delphi своя куча и стандартные Windows фукции с его памятью не работают, а в самом Delphi функии аллокрованного размера нет (что весьма обоснованно)
З.З.З.Ы. надеюсь чем PChar(ASCIIZ(zero ended)) от String отличается объяснять не надо.
Dmitriy Polskoy (2002-10-03 13:42:00) [3]2 gek © (03.10.02 13:37)
Это не имеет значения.
qube (2002-10-03 13:42:00) [4]Socket.ReceiveBuf( buf^,l);
gek (2002-10-03 13:37:00) [5]Размер надо указывать
Dmitriy Polskoy (2002-10-03 13:35:00) [6]А по поводу Dmitriy Polskoy © (03.10.02 13:11)?
Kacnep (2002-10-03 13:31:00) [7]или Length(buf) или sizeof(buf^)
но последнее не точно - сорри
qube (2002-10-03 13:12:00) [8]При выделении запомнить, сколько памяти выделяли
Dmitriy Polskoy (2002-10-03 13:11:00) [9]В этом коде на последней строке выскакивает ошибка, из-за чего не могу понять.
procedure TForm1.ClientSocketRead(Sender: TObject;
Socket: TCustomWinSocket);
var l: Integer;
buf: PChar;
src: TFileStream;
begin
l := Socket.ReceiveLength;
GetMem(buf,l+1);
Socket.ReceiveBuf(buf,l);
src := TFileStream.Create("aaa.txt",fmOpenReadWrite);
src.Seek(0,soFromEnd);
src.WriteBuffer(buf,l);
src.Free;
FreeMem(buf);
end;
Dmitriy Polskoy (2002-10-03 13:06:00) [10]А как получить длинну?
qube (2002-10-03 12:47:00) [11]SizeOf(buf) -- размер указателя.