从OleVariant获取IStream

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?

Mik*_*son 9

试试这个

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有一个内置的类型转换,从OleVariantIUnknown,所以你需要先投OleVariantIUnknown,然后使用as运营商做QueryInterface,以获得IStream接口.

你可以不投OleVariant,直接到IStream,因为没有内置的类型转换,从OleVariantIStream.

  • @David这里描述了从OleVariant获取接口的技术.http://www.techvanguards.com/stepbystep/comdelphi/client.asp.大约2/3在文档中.关于"提取vtable接口指针"的东西.我现在要迟到才弄明白为什么需要这样做. (2认同)