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?