2011-02-08 4 views
3

私はWinHTTPと一緒にDelphiを使用してインターネットからいくつかのファイルをダウンロードするHTTPリクエストをしていますが、リクエストを行うことはできますが、OleVariantからIStreamを取得する方法はわかりませんResponseStreamから返されます。私はグーグルで多くの時間を過ごしましたが、どうやってそれをするのか分かりません。ここで私が試したものです:OleVariantからIStreamを取得する

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を怖がらせるのですか?

+0

'Application.Terminate'を呼び出すと実行が停止するという前提が正しくありません。これはちょうど 'WM_QUIT'メッセージを投稿しますが、あなたの関数は実行を続けます。 –

答えて

9

あなたがインターフェイス上でFreeAndNilを呼び出してはいけません。この

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

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

FreeAndNil(instream); 
    FreeAndNil(req); 

EDIT2:あなたは、これは正確ではないか、それを説明することができればと思うなら

に何が起こっているかを説明しようと、編集または補完すること自由に感じてください。より良い。

req.ResponseStreamは、OleVariantです。 asキーワードはQueryInterfaceに電話しており、それはOleVariantで実装されていません。

OleVariantはそうあなたが最初IUnknownOleVariantをキャストする必要があり、その後、IStreamインターフェイスを取得するためにQueryInterfaceを行うas演算子を使用OleVariantからIUnknownに型変換が組み込まれています。

OleVariantからIStreamに型変換に建てられたがありませんので、あなたはIStreamに直接OleVariantをキャストすることはできません。

+0

これはあまり参考にするものではなく、TObjectのサブクラスではないので、Freeを呼び出すことは意味がありません。 –

+0

@David Heffernan-もしあなたがそうした場合、手順が範囲外になると、アクセス違反が発生します。私は、それを引き起こしているプロシージャの終了後にリリースする呼び出しだと思います。 –

+0

@Mikaelインターフェイスで 'Free'を呼び出すことはできません。あなたはオブジェクトに対して 'Free'を呼び出すことしかできません。参照カウントは無関係です。 FreeAndNilで逃げる唯一の方法は、型なしのパラメータを取ることです。参照を削除する部分を削除するには、次のようにします。procedure FreeAndNil(var obj); TObject(obj).Free;を開始します。終了; ' –