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'.
関連このサンプルコード:http://stackoverflow.com/questions/2771551/cast-object-as-olevariant-in-delphi –
TOleStream関連:http://stackoverflow.com/questions/4443376/how-to-free-tolestream-in-this-bit-of-code –