3

DelphiとWinHTTPを使用して、インターネットからいくつかのファイルをダウンロードするためのHTTPリクエストを実行しています。リクエストは実行できますが、から返される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;

しかし、エラーが発生します[DCC Error] main.pas(45): E2015 Operator not applicable to this operand type(45行目はinstream := req.ResponseStream as IStream;)。

OleVariantからIStreamを怖がらせるにはどうすればよいですか?

4

1 に答える 1

9

これを試して

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

編集1 インターフェイスでFreeAndNilを呼び出さないでください。FreeAndNilには、オブジェクトインスタンスのみを渡すことができます。そうしないと、例外が発生します。とにかくインターフェースは参照カウントされるので、単にスコープから外すことができ、クリーンアップされます。したがって、以下を削除する必要があります。

  FreeAndNil(instream);
  FreeAndNil(req);

Edit2:何が起こっているのかを説明しよう

これが正確でないと思われる場合、またはより適切に説明できる場合は、自由に編集または補足してください。

req.ResponseStreamですOleVariant。キーワードはへのas呼び出しを行ってQueryInterfaceおり、それはによって実装されていませんOleVariant

OleVariantOleVariantにはtoからの型変換が組み込まれているため、インターフェイスを取得するにはIUnknown、最初にtoをキャストしてOleVariantから、演算子をIUnknown使用してを実行する必要があります。asQueryInterfaceIStream

からへの型変換が組み込まれていないため、OleVariantに直接キャストすることはできません。IStreamOleVariantIStream

于 2011-02-08T21:42:49.280 に答える