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
 
WorstNightmare

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

Zugriffsverletzung beim 2. Aufruf von Interface Methode

  Alt 11. Okt 2010, 15:15
Delphi-Version: 2010
Hallo,

ich habe folgendes Interface:
Delphi-Quellcode:
  TFileInfo = packed record
    Name: WideString;
    Size: Integer;
  end;
  PFileInfo = ^TFileInfo;
  PFileInfos = array of PFileInfo;

  WideStrings = array of WideString;

  IDownloadPlugin = interface(ILoadPlugin)
    ['{30DABA9A-6B0B-44BB-8552-816DB0C68FD8}']
    procedure Init(Ifc: IDownload); stdcall;
    function GetFileInfo(Link: WideString): TFileInfo; stdcall;
    function GetFileInfoMulti(Links: WideStrings): PFileInfos; stdcall;
    procedure Download(Link: WideString); stdcall;
    procedure Premium(Link, Username, Password: WideString); stdcall;
    function GetAccountInfo(Username, Password: WideString): TAccountInfo; stdcall;
    function CheckFile(Contents: WideString): Boolean; stdcall;
  end;
Es wird mit Init initialisiert, dort wird auch ein anderes Interface übergeben, von dem das Plugin auch Methoden ausführt. IDownloadPlugin ist in einer DLL, IDownload im Host.
Nun rufe ich GetFileInfoMulti auf und bekomme beim ersten Mal auch die Zeiger auf die Datei-Informationen als Array wieder, verarbeite sie entsprechend und führe Dispose für alle Zeiger aus. "Links" und das zurückgegebene PFileInfos wird dann auf nil gesetzt.
Wenn ich die Methode dann ein zweites Mal mit einem anderen Array aufrufen will, gibt es beim Aufruf in der DLL eine A/V. Der erste Befehl der Methode wird nicht mehr erreicht, er hängt irgendwo dazwischen.

Dies ist der Code im Host, der 2. Aufruf (der fehlschlägt) findet statt wenn mehr als 40 Links verarbeitet werden müssen und es somit mehrere Durchläufe in der Schleife gibt.
Delphi-Quellcode:
var
  i, Loops, j: Integer;
  Infos, InfoSplit: PFileInfos;
  LinkList, Split: WideStrings;
  Hoster: string;
begin
 ....
    Loops := Ceil(Length(LinkList) / 40);

    for i := 0 to Loops - 1 do
    begin
      Split := Copy(LinkList, i * 40, 40);

      // Da eh alle das selbe Plugin haben, verwenden wir einfach mal das vom 1. Link in der Liste
      TData(FHosterLinks[Hoster][0]).Load; // hier wird das Interface erstellt
      try
        InfoSplit := TData(FHosterLinks[Hoster][0]).PlgInstance.GetFileInfoMulti(Split);
      finally
        TData(FHosterLinks[Hoster][0]).Unload(True);
        Split := nil;
      end;

      // InfoSplit an die richtige Stelle im Infos array kopieren
      for j := 0 to High(InfoSplit) do
      begin
        SetLength(Infos, Length(Infos) + 1);
        Infos[High(Infos)] := InfoSplit[j];
      end;

      InfoSplit := nil; // Interessant: Wenn ich diese Zeile herausnehme geht alles einwandfrei
    end;
Ich habe herausgefunden, dass wenn ich die Zeile wo InfoSplit := nil gesetzt wird rausnehme, alles geht. Warum ist das so?

Geändert von WorstNightmare (11. Okt 2010 um 15:32 Uhr)
  Mit Zitat antworten Zitat
 


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 00:02 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 by Thomas Breitkreuz