6

これは、私が Web ブラウザ コンポーネントにファイルをロードするために使用する Delphi で行われたカスタム ネームスペース ハンドラからのものです。

データストリーム: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 を変数に入れて、このように割り当てると

変数
TOS:TOleStream;

TOS:=TOleStream.Create(データストリーム)
TOS.CopyFrom(F, F.Size);

..
TOS.無料;
終わり;

最後に、TOS 変数を解放すると、エラー (ComObj 内の TComObject.ObjRelease を指す EAccessViolation) が発生します。コメントとヘルプをいただければ幸いです。この問題は、しばらくの間私を悩ませてきました。

また、FastMM4で何かできるのだろうかと思っていますか? 虚偽の情報を提供している可能性はありますか?次のようなコードで。通常、TOLEStream はどのように解放されますか?

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

また、TFileStream を使用せずにデータをデータストリームに送信する方法はありますか?

Remy さん、こちらで fastmm と問題の手順を使用した名前空間ハンドラーの動作デモ プロジェクトを見つけることができます: http://mode5.webs.com/namespace.7z プロジェクトが読み込まれたら、ボタンをクリックして名前空間ハンドラーを読み込みます。ファイル。終了すると、fastmm エラーが発生するはずです。敬具、

4

1 に答える 1

4

IStream インターフェイスを何かに渡す必要がある場合は、TStreamAdapter オブジェクトを調べる必要があります。TFileStream で作成し、その ISt​​ream インターフェイスを渡すことができます。

于 2010-12-15T07:39:07.923 に答える