我正在使用 Delphi 和 WinHTTP 来执行 HTTP 请求以从 Internet 下载一些文件,并且我可以执行该请求,但我不知道如何从返回的 OleVariant 获取 IStreamResponseStream
。我花了很多时间谷歌搜索,但我不知道该怎么做。这是我尝试过的:
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?
Try this
instream := IUnknown(req.ResponseStream) as IStream;
Edit 1您不得在接口上调用 FreeAndNil。 FreeAndNil 只能传递一个对象实例。如果不这样做会导致异常。由于接口无论如何都是引用计数的,因此您可以简单地让它们超出范围,然后它们就会被清理。因此,您需要删除:
FreeAndNil(instream);
FreeAndNil(req);
Edit2:尝试解释发生了什么
如果您认为本文不准确或可以更好地解释,请随时编辑或补充。
req.ResponseStream
is an OleVariant
. The as
关键字正在调用QueryInterface
这不是由OleVariant
.
OleVariant
有一个内置的类型转换OleVariant
to IUnknown
所以你需要先投射OleVariant
to IUnknown
然后使用as
操作员做一个QueryInterface
为了得到IStream
界面。
你不能施放OleVariant
直接到一个IStream
因为没有内置的类型转换OleVariant
to IStream
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)