2012-10-31 8 views
5

Ich verwende Delphi XE. Ich habe ein Problem mit Speicherverlust mit Delphi Soap gefunden. Es stellt sich heraus wegen eines fehlenden .Free Anruf zu sein in TWSDLLookup.Destroy, wie beschrieben in QC 91160Delphi XE Speicherverlust in TWSDLLookup.Destroy Methode

Das Problem, das ich habe, ist die beschriebene Behelfslösung, die einfach FLookup.Free zur TWSDLLookup.Destroy Methode hinzuzufügen ist.
Ich möchte nicht die Delphi-Quelle ändern, also habe ich versucht, das Gerät in meinen Projektordner zu kopieren, die Änderung vorzunehmen und neu zu kompilieren, wie in Toms Antwort here beschrieben. Das Problem mit dieser Technik ist, dass es anscheinend nur funktioniert, wenn Sie auch alle abhängigen Einheiten neu kompilieren. Ich habe versucht, nur WSDLLookup.pas in mein Projektverzeichnis zu kopieren, und ich bekomme einen Stackoverflow-Fehler. Ich bin nicht vertraut mit Web Services/SOAP, also weiß ich nicht, welche anderen Einheiten ich kopieren sollte, wenn ich diese Technik verwende.

Die Antwort von Rob Kennedy auf derselben Seite beschreibt eine andere Technik mit Code-Hooking - aber es scheint nicht für Objektmethoden zu gelten. Ich habe getan, wie er den kostenlosen Code für die TNT-Unicode-Steuerelemente vorgeschlagen und heruntergeladen und die relevanten Prozeduren gefunden, aber ich konnte keine Informationen darüber finden, wie man die Methoden eines Objekts haken kann - falls dies tatsächlich möglich ist. Wenn ich das tun könnte, würde ich dann TWSDLLookup.Destroy haken und den FLookup.Free Anruf hinzufügen.

Irgendwelche Ideen für, wie man das behebt, wird sehr geschätzt. Ich bin ein bisschen ein Anfänger Programmierer, also hoffe ich, dass ich etwas Offensichtliches verpasst habe?

Antwort

3

Was Sie versuchen zu tun, funktioniert in der Tat gut. Ich habe es selbst getestet. Hier ist die Projektdatei I verwendet:

program WSDLLookupTest; 

{$APPTYPE CONSOLE} 

uses 
    WSDLLookup in 'WSDLLookup.pas'; 

var 
    intf: IInterface; 

begin 
    intf := GetWSDLLookup as IInterface; 
end. 

Ich habe eine Kopie der WSDLLookup.pas Datei und platziert sie im selben Verzeichnis wie die .dpr Datei. Dann, in der Kopie und nicht im Original, änderte ich TWSDLLookup.Destroy.

destructor TWSDLLookup.Destroy; 
begin 
    Beep; 
    ClearWSDLLookup; 
    FLookup.Free; 
    inherited; 
end; 

ich hinzugefügt, um die Beep um mir zu beweisen, dass dieser Code tatsächlich ausgeführt wurde.

In Ihrer Position würde ich definitiv diese Lösung anstelle von Code-Haken verwenden. Und natürlich ist die andere einfache Lösung ein Upgrade auf eine spätere Delphi-Version.

Eine Sache, auf die Sie achten sollten, ist daran zu denken, die modifizierte Einheit zu entfernen, wenn Sie ein Upgrade durchführen. Das Leck wurde in XE2 behoben.

+0

Danke für die schnelle Antwort :) –

+0

Ich sah etwas darüber, dass die Verwendung von Debug-Dcus könnte ein Problem verursachen - möglicherweise das ist, warum ich meine Stapelüberlauf bekommen. Oder vielleicht habe ich einen anderen Fehler. –

+0

Wie auch immer, nochmals vielen Dank. Da es funktioniert, werde ich versuchen herauszufinden, was ich sonst noch falsch mache :) –

Verwandte Themen