2011-07-22 5 views
3

this questionへの回答は、DelphiでのタイプライブラリのインポートによるWinHTTPの使用がいかに簡単かを示しました。Delphi XEを使用してWinHTTP経由でダウンロードしたファイルをディスクに保存

WinHTTP用のタイプライブラリをインポートし、そのAPIを使用してファイルダウンロードヘルパ関数を書き込もうとしました。ここに私はどれくらいの距離があるのですか:

IWinHttpRequest.ResponseStream(TLBファイルのOleVariantとして宣言されています)をストリームとしてディスクに保存する方法を理解できないようです。

// IWinHttpRequest is defined by importing type library of WinHTTP. 
// Microsoft WinHTTP Services, version 5.1 (Version 5.1) C:\Windows\system32\winhttp.dll 
function Download(const url, filename: String): Boolean; 
var 
    http: IWinHttpRequest; 
    wUrl: WideString; 
    fs:TFileStream; 
    FileStream:IStream; 
    sz,rd,wr:Int64; 
begin 
    try 
    wUrl := url; 
    http := CoWinHttpRequest.Create; 
    http.open('GET', wurl, False); 
    http.send(EmptyParam); 

    FStatus := http.status; // 200=OK! 
    result := FStatus=200; 


    if result then 
    begin 
    fs := TFileStream.Create(filename, fmCreate, fmShareExclusive); 
    try 
     FileStream := TStreamAdapter.Create(fs, soReference) as IStream; 
     sz := http.ResponseStream.Size; 
     http.ResponseStream.CopyTo(FileStream,sz,rd,wr); 
    finally 
     FileStream := nil; 
     fs.Free; 
    end; 
    end; 
    except 
     result := false; 
     // do not raise exceptions. 
    end; 
end; 

WinHTTP_TLB.pasからの抜粋:

IWinHttpRequest = interface(IDispatch) 
    ['{016FE2EC-B2C8-45F8-B23B-39E53A75396B}'] 
    ...... 
    property ResponseStream: OleVariant read Get_ResponseStream; 

アップデート:私は今http.ResponseStream.CopyTo(...)

EOleError 'Variant does not reference an automation object'. 
+0

関連このサンプルコード:http://stackoverflow.com/questions/2771551/cast-object-as-olevariant-in-delphi –

+0

TOleStream関連:http://stackoverflow.com/questions/4443376/how-to-free-tolestream-in-this-bit-of-code –

答えて

6

ウォーレンへの呼び出しで、あなたが使用する必要があり、OLEバリアントに関する実行時例外を取得応答ストリームをClasses.TFileStream

でcomunicateするクラス AxCtrls.TOleStreamこの

IWinHttpRequest.ResponseStream -> TOleStream -> TFileStream 

チェックのような3210

何か

{$APPTYPE CONSOLE} 

uses 
    Variants, 
    ActiveX, 
    Classes, 
    AxCtrls, 
    WinHttp_TLB, 
    SysUtils; 


function Download(const url, filename: String): Boolean; 
var 
    http: IWinHttpRequest; 
    wUrl: WideString; 
    fs:TFileStream; 
    HttpStream :IStream; 
    sz,rd,wr:Int64; 
    FStatus : Integer; 
    OleStream: TOleStream; 
begin 
    try 
    wUrl := url; 
    http := CoWinHttpRequest.Create; 
    http.open('GET', wurl, False); 
    http.send(EmptyParam); 

    FStatus := http.status; // 200=OK! 
    result := FStatus=200; 

    if result then 
    begin 
    HttpStream:=IUnknown(http.ResponseStream) as IStream; 
    OleStream:= TOleStream.Create(HttpStream); 
    try 
     fs:= TFileStream.Create(FileName, fmCreate); 
     try 
     OleStream.Position:= 0; 
     fs.CopyFrom(OleStream, OleStream.Size); 
     finally 
     fs.Free; 
     end; 
    finally 
     OleStream.Free; 
    end; 
    end; 

    except 
     result := false; 
     // do not raise exceptions. 
    end; 
end; 


begin 
    try 
    Download('http://foo.html','C:\Foo\anyfile.foo'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 
+0

それは素晴らしい作品です。 –

関連する問題