2010-12-14 22 views
6

這是從Delphi中完成的自定義名稱空間處理程序中完成的,我用它將文件加載到webbrowser組件中。如何在這段代碼中釋放TOleStream

 

Datastream:IStream; 

var 
    F: TFileStream; 
    Dummy: INT64; 
begin 

    F:=TFileStream.Create(strfilename fmOpenRead); 
    CreateStreamOnHGlobal(0, True, DataStream); 
    TOleStream.Create(DataStream).CopyFrom(F, F.Size); 
    DataStream.Seek(0, STREAM_SEEK_SET, Dummy); 
    TotalSize := F.Size; 
    F.Free; 
end; 

的問題是程序結束,並說TOleStream未釋放時Fastmm4給出了內存泄漏錯誤。我如何釋放它?如果我把TOleStream一個變量,並將這樣的

 
var 
TOS:TOleStream; 

TOS:=TOleStream.Create(DataStream) 
TOS.CopyFrom(F, F.Size); 

.. 
TOS.Free; 
End; 

當我釋放TOS可變我得到最終的誤差(EAccessViolation指向TComObject.ObjRelease在ComObj)。我會感謝您的意見和幫助。這個問題一直在困擾我一段時間。

我也想知道它是否可以與FastMM4?它會提供虛假信息嗎?在一些代碼如下。 TOLEStream通常是如何釋放的?

 
f.SaveToStream(TOleStream.Create(DataStream)); 

有沒有辦法發送數據到數據流而不使用TFileStream?

雷米嗨, 你可以找到與fastmm和問題的過程這裏的命名空間處理器的工作演示項目:http://mode5.webs.com/namespace.7z 當項目加載,單擊按鈕具有的命名空間處理程序載入的文件。當你退出時,你應該得到fastmm錯誤。 親切的問候,

+2

嗨,模式,歡迎來到StackOverflow。這是一個相當不錯的問題,但如果我們知道在釋放錯誤時得到的錯誤會有所幫助。你能編輯你的問題,並複製你在這裏給我們的錯誤嗎?謝謝。 – 2010-12-14 20:02:55

+0

FastMM沒有錯。你到底想要做什麼?將文件加載到IStream中,並使用它做些什麼?該文件是否應該修改,還是希望它是隻讀的? – 2010-12-17 16:08:12

回答

3

如果你需要通過一個IStream接口的東西,你應該看看TStreamAdapter對象,你可以創建一個TFileStream,並通過其IStream接口。

+0

感謝Stijn,我將嘗試 – Mode 2010-12-15 07:59:34

+0

感謝Stijn,你能詳細說明一下嗎?當我嘗試使用Datastream時:= TStreamadapter.create(f,soOwned); Fastmm4拋出一個錯誤,說我試圖使用一個釋放對象的接口。一些演示代碼會很有幫助。再次感謝。 – Mode 2010-12-15 08:56:36

+0

我不知道我明白你的意思是「在Delphi中完成的自定義名稱空間處理程序,我用它將文件加載到webbrowser組件」我不認爲自定義名稱空間手柄是加載webbrowser內容的最佳方式。有IInternetProtocol,但這是很多工作要實現自己,我知道,因爲我在這裏嘗試:http://xxm.sf.net/ – 2010-12-17 23:22:39