Oke*_*key 3 delphi ole istream winhttprequest delphi-2010
我正在使用Delphi和WinHTTP来执行HTTP请求以从Internet下载一些文件,我可以执行请求但我不知道如何从返回的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;
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误[DCC Error] main.pas(45): E2015 Operator not applicable to this operand type(第45行instream := req.ResponseStream as IStream;).
如何从OleVariant中吓跑IStream?
试试这个
instream := IUnknown(req.ResponseStream) as IStream;
Run Code Online (Sandbox Code Playgroud)
编辑1 您不能在界面上调用FreeAndNil.FreeAndNil只能传递一个对象实例.如果不这样做会导致异常.由于接口是引用计数,因此您可以简单地让它们超出范围并将它们清理干净.所以,你需要删除:
FreeAndNil(instream);
FreeAndNil(req);
Run Code Online (Sandbox Code Playgroud)
Edit2:尝试解释发生了什么
如果您认为这不准确或者可以更好地解释,请随时编辑或补充.
req.ResponseStream是一个OleVariant.该as关键字是做一个呼叫QueryInterface,并且不会被执行OleVariant.
OleVariant有一个内置的类型转换,从OleVariant到IUnknown,所以你需要先投OleVariant来IUnknown,然后使用as运营商做QueryInterface,以获得IStream接口.
你可以不投OleVariant,直接到IStream,因为没有内置的类型转换,从OleVariant到IStream.
| 归档时间: |
|
| 查看次数: |
1885 次 |
| 最近记录: |