2011-02-08 46 views
3

我使用Delphi和WinHTTP一起執行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`消息,但你的函數將繼續執行。 – 2011-02-08 21:53:18

回答

9

試試這個

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

編輯1 你不能調用FreeAndNil接口上。 FreeAndNil只能傳遞一個對象實例。不這樣做會導致異常。由於無論如何您都可以通過參考來計算,您可以簡單地讓它們超出範圍,並且它們將被清除。所以,你需要刪除:

FreeAndNil(instream); 
    FreeAndNil(req); 

EDIT2:一個試圖解釋這是怎麼回事

請隨意修改或補充,如果你認爲這是不準確的,或者如果它可以解釋更好。

req.ResponseStreamOleVariant。關鍵字as正在撥打電話QueryInterface,但未通過OleVariant實施。

OleVariant有一個內置的從OleVariantIUnknown類型轉換,所以你需要先投OleVariantIUnknown,然後使用as運營商爲了獲得IStream界面做了QueryInterface

由於沒有從OleVariantIStream的內置類型轉換,因此不能將OleVariant直接投射到IStream

+0

這並不是說你應該對引用計數的事情做這件事,更重要的是它們不是TObject的子類,因此對它們調用Free是沒有意義的。 – 2011-02-08 21:52:17