6

这是来自在 Delphi 中完成的自定义命名空间处理程序,我用来将文件加载到 webbrowser 组件中。

数据流:IStream;

变量
  F:TFileStream;
  假人:INT64;
开始

  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.免费;
结尾;

问题是 Fastmm4 在程序结束时会出现内存泄漏错误,并说 TOleStream 没有被释放。我如何释放它?如果我将 TOleStream 放在一个变量中并像这样分配

变量
服务条款:TOleStream;

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

..
TOS.免费;
结尾;

最后,当我释放 TOS 变量时,我得到一个错误(EAccessViolation 指向 ComObj 中的 TComObject.ObjRelease)。我会很感激你的意见和帮助。这个问题已经困扰我一段时间了。

我也想知道它是否可能与 FastMM4 相关?会不会是提供虚假信息?在下面的一些代码中。TOLEStream 通常是如何释放的?

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

有没有办法在不使用 TFileStream 的情况下将数据发送到数据流?

嗨 Remy,您可以在此处找到带有 fastmm 和问题过程的命名空间处理程序的工作演示项目:http://mode5.webs.com/namespace.7z 项目加载时,单击按钮以加载命名空间处理程序文件。当你退出时,你应该得到 fastmm 错误。亲切的问候,

4

1 回答 1

4

如果你需要传递一个 IStream 接口给某个东西,你应该查看 TStreamAdapter 对象,你可以在 TFileStream 上创建一个,并传递它的 IStream 接口。

于 2010-12-15T07:39:07.923 回答