2011-01-10 8 views
2

In unserer D2007-Anwendung verwenden wir einen Webservice, auf den mit einem THTTPRIO-Objekt zugegriffen wird. Wenn das TDatamodule, das das THTTPRIO-Objekt enthält, zerstört wird, tritt eine Zugriffsverletzung auf.OpToSoapDomComv.TRefCache.FNodes enthält Verweise auf nicht vorhandene XMLNodes

Dieses AV angehoben wird, wenn der TSoapDOMConvert befreit wird, was wiederum ausführt:

TRefCache(RefMap[0].Instance).Free 

Aufruf
destructor TRefCache.Destroy; 
begin 
    FHREFs.Free; 
    FMHREFs.Free; 
    FNodes := nil; //Causes AV 
end; 

Fnodes ist ein TInterfaceList eine Referenz auf IXMLNodes enthält, aber das Objekt zu haben scheint wurde vor all dem befreit.

Kennt jemand dieses Problem? Wie man es löst?

[Bearbeiten] Weitere Informationen über die Verwendung des RIO Objekts Das THTTPRIO Objekt nur in dem folgenden Aufruf die Webservice verwendet:

LIResult.Assign((Rio as IWSLicenseIntf).CheckLicense(FLicenseInfo)); 

Das LIResult Objekt wird später befreit.

Antwort

2

THTTPRIO verfügt über zwei verschiedene Lebensdauerverwaltungsschemata. Eine als Komponente und eine als Schnittstelle. Sie zu mischen ist eine schlechte Idee. Dies könnte dein Problem sein.

Jean-Marie Babet kommentierte dies hier. http://www.delphigroups.info/2/11/344722.html

Die Quelldatei aus dem WSDL erzeugt sollte eine Funktion GetIWSLicenseIntf (oder ähnlich) hat genannt. Versuchen Sie, das anstelle der Rio-Komponente zu verwenden. Ändern Sie (Rio as IWSLicenseIntf) zu GetIWSLicenseIntf() und fügen Sie Parameter UseWSDL und URL hinzu, falls erforderlich.

Ein andere Möglichkeit wäre so etwas wie dies

var 
    WSLic: IWSLicenseIntf; 
    RIO: THTTPRIO; 
begin 
    RIO := THTTPRIO.Create(nil); 
    RIO.URL := 'www.whatever.com'; 
    WSLic := RIO as IWSLicenseIntf; 
    LIResult.Assign((WSLic).CheckLicense(FLicenseInfo)); 
end; 

Interfaces in Delphi seine Referenz gezählt wird, so sollte man nicht frei WSLic und nicht frei RIO. Es wird für Sie freigegeben, wenn WSLic den Gültigkeitsbereich verlässt. Der Code wird natürlich nicht getestet, da ich Ihren Code nicht habe.

+0

Ich habe versucht, die THTTPRIO-Komponente manuell im Code zu erstellen und zu befreien, mit "THTTPRIO.Create (nil)" und "FreeAndNil (RIO)" aber immer noch bekomme ich die gleiche AV. Ich habe den ersten Beitrag hier bearbeitet, um die Verwendung des RIO-Objekts detaillierter zu zeigen – Bascy

+0

@Micke - Kommentar nur um Micke zu benachrichtigen gibt es eine Antwort auf seinen Kommentar – Bascy

+0

@Bascy Bearbeitete Antwort –