【问题标题】:How to free TOleStream in this bit of code如何在这段代码中释放 TOleStream
【发布时间】:2011-05-25 12:13:45
【问题描述】:

这是来自在 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)。感谢您的 cmets 和帮助。这个问题已经困扰了我一段时间了。

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

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

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

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

【问题讨论】:

  • 嗨,Mode,欢迎来到 StackOverflow。这是一个很好的问题,但如果我们知道释放它时会出现什么错误,这将有所帮助。您可以编辑您的问题并为我们复制您在此处输入的错误吗?谢谢。
  • FastMM 没有错。你到底想做什么?将文件加载到 IStream 中并对其进行处理?文件应该被修改还是你希望它是只读的?

标签: delphi ole fastmm


【解决方案1】:

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

【讨论】:

  • 谢谢 Stijn,我要试试
  • 谢谢 Stijn,你能详细说明一下吗?当我尝试使用 Datastream:=TStreamadapter.create(f,soOwned); Fastmm4 抛出一个错误,说我正在尝试使用已释放对象的接口。一些演示代码会有所帮助。再次感谢。
  • 我不确定我是否理解“在 Delphi 中完成的自定义命名空间处理程序我用来将文件加载到网络浏览器组件中”的意思我不认为自定义命名空间处理程序是最好的方法加载网页浏览器内容。有IInternetProtocol,但是要自己实现需要做很多工作,我知道是因为我在这里尝试过:xxm.sf.net
  • @Mode:请显示您遇到问题的实际代码。
猜你喜欢
  • 2013-08-24
  • 2015-07-31
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多