2010-12-14 3 views
6

Dies ist von einem benutzerdefinierten Namespacer-Handler in Delphi ich zum Laden von Dateien in eine Webbrowser-Komponente verwendet.So befreien Sie TOleStream in diesem Bit Code

 

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; 

Das Problem ist, dass Fastmm4 ein Speicherleck Fehler gibt, wenn das Programm beendet wird und sagt, dass TOleStream wurde nicht befreit. Wie kann ich es freigeben? Wenn ich TOleStream in einer Variablen setzen und weisen ähnliche

 
var 
TOS:TOleStream; 

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

.. 
TOS.Free; 
End; 

bekomme ich einen Fehler (EAccessViolation zu TComObject.ObjRelease in ComObj zeigt) am Ende, wenn ich die TOS Variable befreien. Ich würde Ihre Anmerkungen und Hilfe schätzen. Dieses Problem nervt mich seit einiger Zeit.

Ich frage mich auch, ob es etwas mit FastMM4 sein könnte? Könnte es falsche Informationen geben? In ein bisschen Code wie folgt. Wie wird TOLEStream in der Regel freigegeben?

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

Und gibt es eine Möglichkeit, Daten an Datenstrom zu senden, ohne den TFileStream zu verwenden?

Hallo Remy, Sie können eine funktionierende Demo-Projekt des Namespace-Handler mit dem FastMM und das Problem Verfahren finden Sie hier: http://mode5.webs.com/namespace.7z Wenn die Projektladungen, die Schaltfläche klicken Sie auf den Namespace-Handler zu haben, um die Dateien zu laden. Wenn Sie beenden, sollten Sie den Fastmm-Fehler erhalten. Mit freundlichen Grüßen

+2

Hallo, Mode, willkommen bei StackOverflow. Das ist eine ziemlich gute Frage, aber es würde helfen, wenn wir wüssten, welchen Fehler Sie bekommen, wenn Sie es freigeben. Können Sie Ihre Frage bearbeiten und den Fehler, den Sie hier eingehen, kopieren? Vielen Dank. –

+0

FastMM ist nicht falsch. Was versuchst du genau? Eine Datei in einen IStream laden und etwas damit machen? Soll die Datei geändert werden oder soll sie nur gelesen werden? –

Antwort

3

Wenn Sie eine IStream-Schnittstelle an etwas übergeben müssen, sollten Sie in das TStreamAdapter-Objekt schauen, Sie können eines auf dem TFileStream erstellen und seine IStream-Schnittstelle übergeben.

+0

Danke Stijn, ich werde versuchen, dass – Mode

+0

Danke Stijn, Können Sie ein wenig erarbeiten? Wenn ich versuche, Datastream zu verwenden: = TStreamadapter.create (f, soOwned); Fastmm4 gibt eine Fehlermeldung aus, dass ich versuche, eine Schnittstelle eines freigegebenen Objekts zu verwenden. Einige Demo-Code wäre hilfreich. Danke noch einmal. – Mode

+0

Ich bin mir nicht sicher, was ich unter "benutzerdefinierter Namespacer-Handler in Delphi zum Laden von Dateien in eine Webbrowser-Komponente" verstehe. Ich glaube nicht, dass ein benutzerdefinierter Namespace-Handler den besten Weg zum Laden von Webbrowser-Inhalten bietet. Es gibt IInternetProtocol, aber das ist eine Menge Arbeit, um sich selbst zu implementieren, ich weiß, weil ich hier versucht habe: http://xxm.sf.net/ –