3

我正在使用 Delphi 和 WinHTTP 执行 HTTP 请求以从 Internet 下载一些文件,并且我可以执行请求,但我不知道如何从从ResponseStream. 我花了很多时间在谷歌上搜索,但我不知道该怎么做。这是我尝试过的:

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;)。

如何从 OleVariant 中吓跑 IStream?

4

1 回答 1

9

尝试这个

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

编辑 1 您不得在接口上调用 FreeAndNil。FreeAndNil 只能传递一个对象实例。不这样做会导致异常。由于接口是引用计数的,你可以简单地让它们超出范围,它们将被清理。因此,您需要删除:

  FreeAndNil(instream);
  FreeAndNil(req);

Edit2:尝试解释发生了什么

如果您认为这不准确或可以更好地解释,请随时编辑或补充。

req.ResponseStream是一个OleVariantas关键字正在调用QueryInterface,而OleVariant.

OleVariant有一个内置的类型转换 from OleVarianttoIUnknown所以你需要先转换OleVarianttoIUnknown然后使用as操作符做 aQueryInterface以获得IStream接口。

您不能将 aOleVariant直接转换为 aIStream因为没有内置类型转换 from OleVariantto IStream

于 2011-02-08T21:42:49.280 回答