Как отправить изображение, сохраненное с помощью GdipSaveImageToStream (), в интерфейсе IStream через соединение через сокет?
Функция send () нуждается в массиве char, но я не знаю, как извлечь данные из IStream в массив char.
Было бы хорошо использовать memcpy ()? Сохранить данные в массиве символов и восстановить поток на другой стороне?
[РЕДАКТИРОВАТЬ]Я пытался использовать чтение, но я что-то упустил.
//stream to char array, to send
STATSTG myStreamStats;
ULONG bytesSaved;
myStream->Stat(&myStreamStats, 0);
char* streamData = new char[myStreamStats.cbSize.QuadPart];
if(myStream->Read(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
cout<<"OK!"<<endl;
else
cout<<"Not OK!"<<endl;
//char array to stream, to save
if(myStreamR->Write(streamData, myStreamStats.cbSize.QuadPart, &bytesSaved) == S_OK)
cout<<"OK!"<<endl;
else
cout<<"Not OK!"<<endl;
myImage = Image::FromStream(myStreamR);
myImage->Save(lpszFilename, &imageCLSID, NULL);
[Примечание 1:] Программа компилируется и запускается, но я не получаю свое изображение. Я получаю его, если использую исходный «myStream», но не с «myStreamR», который построен из массива char, считанного из исходного потока.
[Примечание 2:] Вывод двух «OK!», Что означает, что все байты копируются в массив, и все они вставляются в новый поток. Однако я проверил saveBytes и обнаружил, что после read () он равен 0 (не очень хорошо), а после write () он равен размеру потока, который я дал. Тогда почему на земле read () дает мне флаг «S_OK», если ничего не читается?
[Примечание 3:] Я что-то упустил.
Использование Read and Write — действительно правильный подход, как указали Йоахим Пилеборг и Зейн.
Однако помните, что курсор поиска меняет положение каждый раз, когда используется поток, поэтому перед чтением и перед записью используйте метод Seek, чтобы вернуть курсор в начало потока.
Пример:
LARGE_INTEGER li;
li.QuadPart = 0;
myStream->Seek(li, STREAM_SEEK_SET, NULL);
Других решений пока нет …