从OleVariant获取IStream

时间:2011-02-08 21:21:43

标签: delphi delphi-2010 ole istream winhttprequest

我正在使用Delphi和WinHTTP来执行HTTP请求以从Internet下载一些文件,我可以执行请求但我不知道如何从{{1返回的OleVariant获取IStream }}。我花了很多时间谷歌搜索,但我无法弄清楚如何做到这一点。这是我尝试过的:

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; (第45行是[DCC Error] main.pas(45): E2015 Operator not applicable to this operand type)。

如何从OleVariant中吓跑IStream?

1 个答案:

答案 0 :(得分:9)

试试这个

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

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

  FreeAndNil(instream);
  FreeAndNil(req);

编辑2:尝试解释发生了什么

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

req.ResponseStreamOleVariantas关键字正在调用QueryInterface,但OleVariant未实施。

OleVariant具有从OleVariantIUnknown的内置类型转换,因此您需要先将OleVariant转换为IUnknown,然后使用{{ 1}}运算符执行as以获取QueryInterface接口。

您无法将IStream直接投射到OleVariant,因为没有从IStreamOleVariant的内置类型转换。