我正在使用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?
答案 0 :(得分:9)
试试这个
instream := IUnknown(req.ResponseStream) as IStream;
修改1 您不能在界面上调用FreeAndNil。 FreeAndNil只能传递一个对象实例。如果不这样做会导致异常。由于接口是引用计数,因此您可以简单地让它们超出范围,它们将被清理。所以,你需要删除:
FreeAndNil(instream);
FreeAndNil(req);
编辑2:尝试解释发生了什么
如果您认为这不准确或者可以更好地解释,请随时编辑或补充。
req.ResponseStream
是OleVariant
。 as
关键字正在调用QueryInterface
,但OleVariant
未实施。
OleVariant
具有从OleVariant
到IUnknown
的内置类型转换,因此您需要先将OleVariant
转换为IUnknown
,然后使用{{ 1}}运算符执行as
以获取QueryInterface
接口。
您无法将IStream
直接投射到OleVariant
,因为没有从IStream
到OleVariant
的内置类型转换。