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

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

Передача структуры которая содержит поле типа pointer [D7, WinXP]


denkop ©   (2004-10-03 00:01:00) 

Имеется структура:

 TCommBlock = record
                Command,
                SenderIP,
                RecvIP:string[15];
                SenderName:string[50];
                Data:pointer;
                DataSize:integer;
              end;

Нужно записать в поле Data данные из строковой переменной передать их через TIdUPDClient/TIdUPDServer

Передаю так:

procedure TMainForm.SendButtonClick(Sender: TObject);
var
UserName, UserIp, Mess:string;
CommBlock:TCommBlock;
Buf:pointer;
begin

    UserName:='DEN';
    UserIp:='127.0.0.1';
    Mess:=MessEdit.Text;

    CommBlock.Command:=Cmd[1];
    CommBlock.SenderName:=NetName;
    CommBlock.RecvIP:=UserIP;
    CommBlock.DataSize:=Length(Mess);
    GetMem(CommBlock.Data, CommBlock.DataSize);
    try
      Move(Mess[1], CommBlock.Data^, CommBlock.DataSize);
      UDPClient.Host:=UserIp;
      UDPClient.SendBuffer(CommBlock, SizeOf (CommBlock));
    finally
      FreeMem(CommBlock.Data);
    end;

end;


А принимаю так:

procedure TMainForm.UDPServerUDPRead(Sender: TObject; AData: TStream;
 ABinding: TIdSocketHandle);
var
CommBlock: TCommBlock;
FileName, Str:string;
StreamBuf:TMemoryStream;
Buf:pointer;
i:integer;
begin
  StreamBuf:=TMemoryStream.Create;
  GetMem(Buf,AData.Size);
  try
    StreamBuf.CopyFrom(AData, AData.Size);
    StreamBuf.Seek(0,soFromBeginning);
    StreamBuf.Read(CommBlock, AData.Size);
  finally
    StreamBuf.Free;
    FreeMem(Buf);
  end;

  Str:='';
  SetLength(Str,CommBlock.DataSize);
  Move(CommBlock.Data^, Str[1], CommBlock.DataSize);

  ShowMessage(Str);

end;

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


denkop   (2004-10-03 01:47:00) [1]

разобрался

data:array [1..1024] of char


denkop   (2004-10-03 00:46:00) [2]

Мда, верно... а как быть в таком случае. Как передать данные переменной длины, в структуре??


denkop   (2004-10-03 00:46:00) [3]

Это всё будет происходить не обзательно в пределах одной машины


GuAV   (2004-10-03 00:45:00) [4]

хотя если в пределах одной машины и одного процесса то почему бы и нет :-)


GuAV   (2004-10-03 00:43:00) [5]


> Передача структуры которая содержит поле типа pointer


> через TIdUPDClient/TIdUPDServer

LOL :-)


VMcL   (2004-10-03 00:28:00) [6]

> Подскажите пожалста, что я делаю не так.

Пытаешься считать область памяти с другого компьютера, имея указатель на область памяти текущего компьютера.


Наверх

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