Добрый день, уважаемые коллеги.
Реализовывая передачу изображения по протоколу
UDP столкнулся с проблемой перевода
TBytes в
TMemoryStream.
Для теста создал новый проект. На форму поместил два
TImage, один
TButton,
TIdUDPClient и
TIdUDPServer.
В
Image1 поместил
PNG изображение (153 байта)
Настраиваю компоненты:
UDPServer->DefaultPort = 2050;
UDPClient->Port = 2050;
UDPClient->Host = "127.0.0.1";
UDPServer->Active = true;
В событии
OnClick для
Button1 выполняю передачу объекта серверу:
TMemoryStream *msS = new TMemoryStream();
TPngImage *png = new TPngImage();
png->Assign(Image1->Picture);
png->SaveToStream(msS);
msS->Position = soFromBeginning;
TByteDynArray DynArray = RawToBytes(msS,msS->Size);
delete png, msS;
png = NULL, msS = NULL;
UDPClient->SendBuffer(DynArray);
Передача проходит на "ура". Теперь обрабатываю событие
OnUDPRead:
void __fastcall TForm1::UDPServerUDPRead(TIdUDPListenerThread *AThread, TBytes AData,
TIdSocketHandle *ABinding)
{
TMemoryStream *msR = new TMemoryStream();
TPngImage *png = new TPngImage();
BytesToRaw(AData,msR,AData.Length); // проблемое место
msR->Position = soFromBeginning;
png->LoadFromStream(msR);
Image2->Picture->Graphic = png;
delete png, msR;
png = NULL, msR = NULL;
}
Картинка появляется в
Image2, но при закрытии формы возникает
Access Violation.
Функция BytesToRaw в третьем параметре требует
int Size. Я передаю ей размер полученных данных (AData.Length) получаю всё тот же
AV.
Пробую передать размер
TBytes (пробовал также для
TByteDynArray):
BytesToRaw(AData,msR,sizeof(AData));
В этом случае поток
msR имеет нулевую длину и ссылается в
NULL
Пробовал работать с этой функцией без сетевой передачи (далее изменённый код
OnClick для
Button1):
TMemoryStream *msS = new TMemoryStream();
TPngImage *png = new TPngImage();
png->Assign(Image1->Picture);
png->SaveToStream(msS);
msS->Position = soFromBeginning;
TByteDynArray DynArray = RawToBytes(msS,msS->Size);
BytesToRaw(DynArray,msS,sizeof(DynArray));
msS->Position = soFromBeginning;
png->LoadFromStream(msS);
mage2->Picture->Graphic = png;
delete png, msS;
png = NULL, msS = NULL;
Тогда ошибок не возникает.
Подскажите пожалуйста, что я делаю неправильно?