![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как передать Record через SendBuf [D6, Win2k]
axx © (2003-11-21 08:49:00)
Сабж. или ссылочку киньте.
type
PRect=^TRect;
TRect=record
CodeID:Byte;
Value:PChar;
end;
Procedure .....
var
f:TRect;
begin
F.CodeID:=1;
F.Value:="Hi";
Socket.SendBuf(F,SizeOf(F));
end;
По этому примеру можно понять что мне требуется. Знаю что не работает так. Подскажите как надо делать .... :)))
Заранее спасибо.
axx (2003-11-21 09:55:00) [1]
Спасибо. Разобрался. Все заработало. А насчет имени - незнаю, так получилось.
Reindeer Moss Eater (2003-11-21 09:49:00) [2]
Кстати, axx, а зачем такое экзотическое имя у твоего пользовательского типа?
Е-Моё имя (2003-11-21 09:28:00) [3]
>> Типизированный указатель
согласен, не заметил
---
nil
Reindeer Moss Eater (2003-11-21 09:27:00) [4]
Типизированный указатель и его инкремент на единицу.
Это логично и стройно.
Reindeer Moss Eater (2003-11-21 09:26:00) [5]
Нет.
Тогда по инерции кто-то напишет:
Inc(PLen,SizeOf(Cardinal));
Reindeer Moss Eater (2003-11-21 09:22:00) [6]
На приемном конце:
1. Считать 1 байт (это будет f.id)
2. Считать 4 байта (это длина строки)
3. Считать количество байтов равное длине строки (это будет f.Value)
Е-Моё имя (2003-11-21 09:22:00) [7]
>> GetMem(p,SizeOf(Byte)+
>> Inc(pb);
тогда уж
Inc(pb,SizeOf(Byte));
:))
---
nil
Digitman (2003-11-21 09:18:00) [8]
> Но почему же не работает
почему-почему)
тебе ж сказали уже - в поле Value ты передаешь 4-байтный указатель на данные, а не сами данные
а этот указатель имеет смысл лишь в ВАП процесса-передатчика ... в ВАП же процесса приемника тот же (принятый) указатель не имеет смысла, и попытка получить данные (которых не существует, ибо никто их не передавал) по этому указателю ведет в конечном итоге в AV
Reindeer Moss Eater (2003-11-21 09:18:00) [9]
procedure SendMyRec(f:TMyRect);
var p:Pointer; pB:PByte; pLen : ^Cardinal;
begin
GetMem(p,SizeOf(Byte)+SizeOf(Cardinal)+StrLen(f.Value));
pb:=p;
pb^:=f.CodeID;
Inc(pb);
pLen := Pointer(pb);
pLen^:=StrLen(f.Value);
Inc(PLen);
StrCopy(PChar(PLen),f.Value);
Socket.SendBuff(p^,SizeOf(Byte)+SizeOf(Cardinal)+StrLen(f.Value));
end;
axx (2003-11-21 09:11:00) [10]
Но почему же не работает
TRect=record
CodeID:Byte;
Value:PChar;
end;
//Server
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyRect: TRect;
Begin
MyRect.CodName:=233;
MyRect.Value:="Hi";
Socket.SendBuf(MyRect,Sizeof(MyRect));
end;
//Client
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
MyRect: TRect;
begin
Socket.ReceiveBuf(MyRect,Socket.ReceiveLength);
ShowMessage(MyRect.Value) возвращает " "
end;
Reindeer Moss Eater (2003-11-21 08:58:00) [11]
SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда потому что размер этого рекорда всегда постоянен.
TRect=record
CodeID:Byte;
Value:PChar;
end;
Первое поле - один байт Второе поле - 4 байта
Плюс выравнивание комплилятора.
axx (2003-11-21 08:54:00) [12]
не передает. SizeOf(f) возвращает всегда одно и тоже значение не зависимо от заполнения рекорда. Я так понял f это указатель.
Reindeer Moss Eater (2003-11-21 08:52:00) [13]
Вот так и надо дклать.