Получение IStream от OleVariant - PullRequest
       30

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

3 голосов
/ 09 февраля 2011

Я использую 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 Ответ

9 голосов
/ 09 февраля 2011

Попробуйте это

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.

...