Передача TStringList через сокет
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.172] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Передача TStringList через сокет
|
Сообщ.
#1
,
|
|
|
|
По сети передается структура следующего вида
![]() ![]() TServerSendFileListMsg = record MsgNumber: integer; FileList: TStringList; end; PServerSendFileListMsg = ^TServerSendFileListMsg; Процедура отправки ![]() ![]() procedure TForm1.ConnectUser(Socket: TCustomWinSocket; Size: Integer); var Msg: TServerSendFileListMsg; i: integer; begin Msg.MsgNumber := MSG_SERVERSENDFILELIST; MSG.FileList := TStringList.Create; Msg.FileList.Clear; for i := 0 to Files.Count - 1 do Msg.FileList.Add(Files.Strings[i]); Socket.SendBuf(Msg,SizeOf(TServerSendFileListMsg)); end; Процедура приема и обработки ![]() ![]() procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var Msg: Pointer; Size: integer; begin Size := Socket.ReceiveLength; GetMem(Msg,Size); Socket.ReceiveBuf(Msg^,Size); HandleMessage(Msg); FreeMem(Msg); end; procedure TForm1.HandleMessage(Msg: Pointer); begin case integer(Msg^) of MSG_SERVERSENDFILELIST: ServerSendFileList(Msg); end; end; procedure TForm1.ServerSendFileList(Msg: PServerSendFileListMsg); var i: integer; begin ListBox1.Items.Clear; for i := 0 to Msg^.FileList.Count - 1 do ListBox1.Items.Add(Msg.FileList.Strings[i]); end; При обращении к Msg.FileList вылетает access violation. В чем проблема? |
|
Сообщ.
#2
,
|
|
|
|
Цитата hawk1 @ В чем проблема? в том, что фактически передаешь указатель на стринглист, а не сам текст. Либо разверни его в структуре в array[0..N] of char, либо передавай отдельно, после заголовка структуры: Socket.SendBuf(PChar(FileList.Text),Length(FileList.Text)); |
|
Сообщ.
#3
,
|
|
|
|
Все равно та же ошибка.
|
|
Сообщ.
#4
,
|
|
|
|
Нужно угадать, какой у тебя теперь код?
|
|
Сообщ.
#5
,
|
|
|
|
мне одному кажется что вот тут не хватает кое чего...
![]() ![]() ListBox1.Items.Add(Msg.FileList.Strings[i]); = ListBox1.Items.Add(Msg^.FileList.Strings[i]); |
|
Сообщ.
#6
,
|
|
|
|
Если речь идёт о об отсутствии оператора разыменования ^, то его ставить необязательно в тех случаях, когда не возникает неоднозначности
|