C++ Builder Загрузка TImage из URL-адреса

У меня возникли проблемы с выяснением того, как загрузить изображение из URL-адреса в элемент управления TImage.

В общем, это то, что мне нужно сделать

   TMemoryStream *str = new TMemoryStream;
   http->Get("http://myurl.mydomain.com/myimage.jpg", str);

Проблема, похоже, в том, что для str не выделено место. И я получаю «Неверная ошибка дескриптора ввода-вывода».

Я не могу узнать размер изображения заранее.

Как мне это сделать, пожалуйста? Я попытался выделить 10 МБ пространства для TMemoryStream, создав фиктивный файл и загрузив этот файл в TMemoryStream, но это также выдает ошибку «Недопустимый обработчик ввода-вывода».

Использование C++ Builder в RAD Studio XE7 для разработки приложений для iOS и Android.

Большое спасибо

Айер


person K Y Iyer    schedule 03.04.2015    source источник


Ответы (1)


Проблема не в коде, который вы показали. TMemoryStream динамически растет по мере того, как в него записываются данные, а TIdHTTP::Get() будет записывать любые данные, которые фактически отправляет сервер. Синтаксис кода, который вы показали, в порядке.

Если вы получаете сообщение об ошибке «IOHandler value is not valid» от Get(), это означает, что запрашивается URL-адрес HTTPS, но производный от TIdSSLIOHandlerSocketBase компонент (например, TIdSSLIOHandlerSocketOpenSSL) не назначен свойству TIdHTTP::IOHandler для обрабатывать SSL/TLS-шифрование. Ваш код запрашивает URL-адрес HTTP, поэтому сервер, скорее всего, отправляет ответ перенаправления, чтобы сообщить TIdHTTP вместо этого запросить URL-адрес HTTPS (проверьте событие TIdHTTP::OnRedirect, чтобы убедиться в этом). Вам необходимо назначить SSL IOHandler для обработки URL-адресов HTTPS.

person Remy Lebeau    schedule 21.03.2016