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

标签 delphi ole fastmm

这是来自 Delphi 中的自定义命名空间处理程序,我用它来将文件加载到 Web 浏览器组件中。


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 的 namespace 处理程序的工作演示项目和问题过程:http://mode5.webs.com/namespace.7z 加载项目时,单击按钮让命名空间处理程序加载文件。当你退出时,你应该得到 fastmm 错误。 亲切的问候,

最佳答案

如果您需要将 IStream 接口(interface)传递给某些内容,您应该查看 TStreamAdapter 对象,您可以在 TFileStream 上创建一个对象,并传递其 IStream 接口(interface)。

关于delphi - 如何在这段代码中释放 TOleStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4443376/

相关文章:

delphi - Delphi Xe2 中的通用排序出现错误

Excel 无法插入超过 255 个字符?

mysql - 从 ms Access mysql 导出包含图片 (BLOB) 的表

delphi - FastMM4、DebugGetMem 中偶尔出现访问冲突

Delphi:FastMM虚拟内存管理引用?

Delphi - 智能指针和泛型 TList

delphi - 声明并初始化 TVarRec(常量数组)参数

delphi - THTTPRIO 的默认超时值是多少

delphi - 如何加快 Delphi XE2 的文字自动化速度

delphi - FastMM 是否检测所有内存泄漏