Как освободить TOleStream в этом кусочке кода

Это из пользовательского обработчика пространства имен, сделанного в Delphi, который я использую для загрузки файлов в компонент веб-браузера.

Datastream: IStream;

вар
  F: TFileStream;
  Пустышка: INT64;
начать

  F:=TFileStream.Create(имя_файла fmOpenRead);
  CreateStreamOnHGlobal(0, True, DataStream);
  TOleStream.Create(DataStream).CopyFrom(F, F.Size);
  DataStream.Seek(0, STREAM_SEEK_SET, Dummy);
  TotalSize:= F.Size;
  F.Free;
конец;

Проблема в том, что Fastmm4 выдает ошибку утечки памяти при завершении программы и сообщает, что TOleStream не был освобожден. Как мне это освободить? Если я положу TOleStream в переменную и назначить, как это

вар
TOS:TOleStream;

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

..
TOS.Free;
Конец;

Я получаю ошибку (EAccessViolation указывает на TComObject.ObjRelease в ComObj) в конце, когда я освобождаю переменную TOS. Буду признателен за ваши комментарии и помощь. Эта проблема беспокоила меня уже некоторое время.

Мне также интересно, может ли это быть что-то с FastMM4? Может ли это давать ложную информацию? В немного кода, как показано ниже. Как обычно освобождается TOLEStream?

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

И есть ли способ отправить данные в поток данных без использования TFileStream?

Привет, Реми, Вы можете найти работающий демонстрационный проект обработчика пространства имен с fastmm и процедурой решения проблемы здесь: http://mode5.webs.com/namespace.7z Когда проект загружается, нажмите кнопку, чтобы загрузить обработчик пространства имен. файлы. При выходе вы должны получить ошибку fastmm. С уважением,

1 ответ

Если вам нужно передать интерфейс IStream чему-либо, вам нужно посмотреть на объект TStreamAdapter, вы можете создать его в TFileStream и передать его интерфейс IStream.

Другие вопросы по тегам