Получение IStream от OleVariant

Я использую Delphi вместе с WinHTTP для выполнения HTTP-запроса на загрузку некоторых файлов из Интернета, и я могу выполнить запрос, но я не знаю, как получить IStream из OleVariant, который возвращается из ResponseStream, Я потратил много времени на поиск в Google, но не могу понять, как это сделать. Вот что я попробовал:

var
  req: IWinHTTPRequest;
  instream: IStream;
begin
  req := CoWinHTTPRequest.Create;

  req.Open('GET', 'http://google.com', false);
  req.Send('');

  if req.Status <> 200 then
  begin
    ShowMessage('failure'#10 + req.StatusText);

    FreeAndNil(req);

    Application.Terminate;
  end;

  instream := req.ResponseStream as IStream;

  ShowMessage('success');

  FreeAndNil(instream);
  FreeAndNil(req);

end;

Но я получаю ошибку [DCC Error] main.pas(45): E2015 Operator not applicable to this operand type (строка 45 instream := req.ResponseStream as IStream;).

Как мне напугать IStream из OleVariant?

1 ответ

Решение

Попробуй это

instream := IUnknown(req.ResponseStream) as IStream;

Редактировать 1 Вы не должны вызывать FreeAndNil для интерфейса. FreeAndNil может быть передан только экземпляр объекта. Невыполнение этого условия приводит к исключению. Так как интерфейсы в любом случае считаются ссылками, вы можете просто позволить им выйти из области видимости, и они будут очищены. Итак, вам нужно удалить:

  FreeAndNil(instream);
  FreeAndNil(req);

Edit2: попытка объяснить, что происходит

Пожалуйста, не стесняйтесь редактировать или дополнять, если вы считаете, что это не правильно или если это можно объяснить лучше.

req.ResponseStream является OleVariant, as Ключевое слово делает вызов QueryInterface и это не реализовано OleVariant,

OleVariant имеет встроенное преобразование типов из OleVariant в IUnknown так что вам нужно сначала разыграть OleVariant в IUnknown а затем использовать as оператор, чтобы сделать QueryInterface для того, чтобы получить IStream интерфейс.

Вы не можете разыграть OleVariant прямо к IStream потому что нет встроенного преобразования типа из OleVariant в IStream,

Другие вопросы по тегам