Как писать и читать Stream, используя indy 10.5.5 C++

Привет я должен прочитать поток с сервера с этим кодом

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key)
{
   //TMemoryStream *TMS = new TMemoryStream;
   TStringStream *TSS = new TStringStream;
   AnsiString A,B;
   TStream *TS;
   INT64 Len;
   try
   {
       if (Key == VK_RETURN)
       {
          Beep(0,0);
          if(Edit1->Text == "mystream")
           {
               TCPClient1->IOHandler->WriteLn("mystream");
               Len = StrToInt(TCPClient1->IOHandler->ReadLn());
               TCPClient1->IOHandler->ReadStream(TS,Len,false);
               TSS->CopyFrom(TS,0);
               RichEdit1->Lines->Text = TSS->DataString;
               Edit1->Clear();
           }
       else
           {
              TCPClient1->IOHandler->WriteLn(Edit1->Text);
              A = TCPClient1->IOHandler->ReadLn();
              RichEdit1->Lines->Add(A);
              Edit1->Clear();
           }
       }
   }
   __finally
   {
       TSS->Free();
   }

}

и каждый раз, когда клиент пытается прочитать поток с сервера, говорит компилятор.

First chance exception at $75D89617. Exception class EAccessViolation with message 'Access violation at address 500682B3 in module 'rtl140.bpl'. Read of address 00000018'. Process Project1.exe (6056)

Как справиться с этим?

1 ответ

Решение

Вы не создаете свой экземпляр TStream объект перед вызовом ReadStream(), Ваш TS переменная полностью неинициализирована. ReadStream() не создает TStream объект для вас, только пишет в него, поэтому вы должны создать TStream себя заранее.

Учитывая код, который вы показали, вы можете заменить TStream полностью с помощью ReadString() метод вместо:

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key) 
{ 
    if (Key == VK_RETURN) 
    { 
        Beep(0,0); 
        if (Edit1->Text == "mystream") 
        { 
            TCPClient1->IOHandler->WriteLn("mystream"); 
            int Len = StrToInt(TCPClient1->IOHandler->ReadLn()); 
            RichEdit1->Lines->Text = TCPClient1->IOHandler->ReadString(Len); 
        } 
        else 
        { 
            TCPClient1->IOHandler->WriteLn(Edit1->Text); 
            String A = TCPClient1->IOHandler->ReadLn(); 
            RichEdit1->Lines->Add(A); 
        } 
        Edit1->Clear(); 
    } 
} 
Другие вопросы по тегам