Как освободить TOleStream в этом кусочке кода - PullRequest
6 голосов
/ 14 декабря 2010

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


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;

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

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

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

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

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

1 Ответ

3 голосов
/ 15 декабря 2010

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

...