2010-12-14 9 views
6

これはDelphiで行われたカスタムネームスペースハンドラからのものです。ファイルをWebブラウザコンポーネントにロードするために使用します。このビットのコードでTOleStreamを解放する方法

 

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; 

問題は、プログラムが終了し、TOleStreamが解放されていないとFastmm4がメモリリークエラーを発生させることです。どのように私はそれを解放するのですか?私は変数に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エラーが発生します。 敬具、

+2

こんにちは、モード、私はStackOverflowへようこそ。それはかなり良い質問ですが、あなたがそれを解放するときにどんなエラーが発生したのか分かっていれば助けになります。質問を編集して、あなたが私たちのためにここに入力したエラーをコピーできますか?ありがとう。 –

+0

FastMMは間違っていません。あなたは正確に何をしようとしていますか?ファイルをIStreamにロードして、何か処理をしますか?ファイルを修正するのか、それとも読み込み専用にしたいのですか? –

答えて

3

あなたが何かにIStreamインターフェイスを渡す必要がある場合、あなたは、あなたが、TFileStreamに1つずつ作成することができますTStreamAdapterオブジェクトに見て、そのIStreamインターフェイスを渡す必要があります。

+0

おかげでStijn、私はそれを試みるつもりです – Mode

+0

おかげでStijn、あなたは少し精緻化できますか?私がDatastream:= TStreamadapter.create(f、soOwned)を使用しようとしました。 Fastmm4は、解放されたオブジェクトのインタフェースを使用しようとしているというエラーをスローします。いくつかのデモコードが役に立ちます。再度、感謝します。 – Mode

+0

私はあなたが「カスタムネームスペースハンドラをDelphiで実行したが、Webブラウザコンポーネントにファイルをロードする」という意味を理解していません。カスタムネームスペースハンドラがウェブブラウザのコンテンツを読み込む最良の方法だとは思わない。 IInternetProtocolがありますが、それは自分自身を実装するための多くの作業です、私はここで試したので知っています:http://xxm.sf.net/ –