Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to free TOleStream in this bit of code

Tags:

delphi

fastmm

ole

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,

like image 906
Mode Avatar asked Dec 14 '10 19:12

Mode


1 Answers

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.

like image 195
Stijn Sanders Avatar answered Sep 22 '22 07:09

Stijn Sanders