AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zugriffsverletzung beim 2. Aufruf von Interface Methode
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung beim 2. Aufruf von Interface Methode

Ein Thema von WorstNightmare · begonnen am 11. Okt 2010 · letzter Beitrag vom 13. Okt 2010
Antwort Antwort
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.493 Beiträge
 
Delphi 12 Athens
 
#1

AW: Zugriffsverletzung beim 2. Aufruf von Interface Methode

  Alt 11. Okt 2010, 15:30
Was passiert den bei Load, PlgInstance und Unload?

Das Interfaceobject darf bei Unload noch nicht freigegeben werden. Innerhalb von Prozeduren/Methoden verwendete Interfaces werden möglicherweise erst beim Verlassen oder bei erneuter Zuweisung eines anderen Interfaceobject freigegeben.

Meine Vermutung, der Compiler erzeugt daraus im Prinzip das:
Delphi-Quellcode:
   DummyInterfaceVariable := nil;
   {Schleife begin}
      Load; // hier wird das Interface erstellt
      try
        if Assigned(DummyInterfaceVariable) then
          DummyInterfaceVariable._Release; // <- hier knallts beim 2.Durchlauf

        DummyInterfaceVariable := PlgInstance;
        if Assigned(DummyInterfaceVariable) then
          DummyInterfaceVariable._AddRef;

        InfoSplit := DummyInterfaceVariable.GetFileInfoMulti(Split);
      finally
        Unload(True); // <- hier wird das Object vermutlich unzulässig freigegeben
        Split := nil;
      end;
   {Schleife end}
   if Assigned(DummyInterfaceVariable) then
     DummyInterfaceVariable._Release; // <- hier könnte es schon bei nur einem Durchlauf
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.757 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zugriffsverletzung beim 2. Aufruf von Interface Methode

  Alt 11. Okt 2010, 16:23
Was ist TData?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#3

AW: Zugriffsverletzung beim 2. Aufruf von Interface Methode

  Alt 11. Okt 2010, 16:31
In Load() wird nur das Interface geholt
FPlgInstance := FHosterPlg.CreateInstance(Link);

CreateInstance wird auf die DLL weitergeleitet, wo einfach Result := TPlugin.Create gemacht wird.

In Unload wird anders als man denken könnte das Interface nicht freigegeben sondern es passieren andere Dinge die hier nicht von Bedeutung sind.

PlgInstance implementiert IDownload und leitet alle Aufrufe (z.B. GetFileInfoMulti) letztendlich auf IDownloadPlugin weiter.

Zitat:
Was ist TData?
Internes Verwaltungsobjekt welches das Interface hält.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.493 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zugriffsverletzung beim 2. Aufruf von Interface Methode

  Alt 12. Okt 2010, 08:49
Um den Fehler einzugrenzen würde ich erst mal so ändern:
Delphi-Quellcode:
var
  plugin: IDownloadPlugin;
{...}
  plugin := TData(FHosterLinks[Hoster][0]).PlgInstance;
  InfoSplit := plugin.GetFileInfoMulti(Split);
  plugin := nil;
Beim "Kopieren" der Infos werden ja nur neue Zeiger auf die jeweiligen TFileInfo-Strukturen angelegt. Ist sichergestellt das diese Daten auch über die gesamte Gültigkeit von "Infos" existieren und nicht überschrieben werden?
  Mit Zitat antworten Zitat
WorstNightmare

Registriert seit: 6. Okt 2008
159 Beiträge
 
RAD-Studio 2010 Arc
 
#5

AW: Zugriffsverletzung beim 2. Aufruf von Interface Methode

  Alt 12. Okt 2010, 18:02
Zitat:
Beim "Kopieren" der Infos werden ja nur neue Zeiger auf die jeweiligen TFileInfo-Strukturen angelegt. Ist sichergestellt das diese Daten auch über die gesamte Gültigkeit von "Infos" existieren und nicht überschrieben werden?
Ich denke es wird nichts ausgeführt was diese Daten löschen würde, es sei denn das geschieht wenn ich InfoSplit := nil setze nachdem alle Zeiger nach "Infos" kopiert wurden. Denn wenn ich nur die Zeile rausnehme geht ja witzigerweise alles. Ich weiß aber nicht warum das dann den 2. Durchgang beeinflusst und nicht erst knallt wenn ich dann auf Infos wieder zugreifen möchte und die FileInfos weiterverarbeite...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz