加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何在这段代码中释放TOleStream

发布时间:2020-12-15 09:51:41 所属栏目:大数据 来源:网络整理
导读:这是在Delphi中完成的自定义命名空间处理程序,用于将文件加载到webbrowser组件中. Datastream:IStream;var F: TFileStream; Dummy: INT64;begin F:=TFileStream.Create(strfilename fmOpenRead); CreateStreamOnHGlobal(0,True,DataStream); TOleStream.Crea
这是在Delphi中完成的自定义命名空间处理程序,用于将文件加载到webbrowser组件中.


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;

问题是Fastmm4在程序结束时出现内存泄漏错误并且说没有释放TOleStream.我如何释放它?如果我把TOleStream放在变量中并像这样分配

var
TOS:TOleStream;

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

..
TOS.Free;
End;

当我释放TOS变量时,我得到一个错误(EAccessViolation指向ComObj中的TComObject.ObjRelease).非常感谢您的意见和帮助.这个问题一直困扰着我一段时间.

我也想知道它是否可能是FastMM4的东西?它会提供虚假信息吗?在一些代码如下. TOLEStream通常如何被释放?

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

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

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读