问题
This is from a custom namespacer handler done in Delphi I use to load files into a webbrowser component.
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;
The problem is that Fastmm4 gives a memory leak error when the program ends and says that TOleStream was not freed. How do I free it? If I put TOleStream in a variable and assign like this
var TOS:TOleStream; TOS:=TOleStream.Create(DataStream) TOS.CopyFrom(F, F.Size); .. TOS.Free; End;
I get an error (EAccessViolation pointing to TComObject.ObjRelease in ComObj)in the end when I free the TOS variable. I would appreciate your comments and help. This problem has been bugging me for a while now.
I am also wondering if it could be something with FastMM4? Could it be giving false information? In a bit of code like the following. How is TOLEStream freed typically?
f.SaveToStream(TOleStream.Create(DataStream));
And is there a way to send data to datastream without using the TFileStream?
Hi Remy, You can find a working demo project of the namespace handler with the fastmm and the problem procedure here: http://mode5.webs.com/namespace.7z When the project loads, click the button to have the namespace handler load the files. When you exit, you should get the fastmm error. Kind regards,
回答1:
If you need to pass an IStream interface to something, you should look into the TStreamAdapter object, you can create one on the TFileStream, and pass its IStream interface.
来源:https://stackoverflow.com/questions/4443376/how-to-free-tolestream-in-this-bit-of-code