![]() |
Problem mit D2009 und IdFTP
Hi!
Folgendes Problem: Ich lade eine Datei hoch bei Uploaded.to, via FTP. Das klappt ein paar mal, irgendwann gibt es aber eine Access Violation -> Lesen von Adresse 0000000 Das kuriose ist, unter Windows XP konnte ich diesen Fehler nicht Reproduzieren, nur unter Windows 2003 tritt er auf. Ich kann auch keine Regelmässigkeit dabei erkennen *grübel*
Delphi-Quellcode:
ftp:= tidftp.Create;
try list:=tstringlist.create; name := ExtractFileName(form3.listview1.Items[listviewind].Caption); Ftp.Host:='ftp.uploaded.to'; Ftp.Username:=Form4.Edit13.text; Ftp.Password:=Form4.Edit12.text; Ftp.Passive:=true; Ftp.Connect(); Ftp.ChangeDir('/'); Ftp.Put(form3.listview1.Items[listviewind].Caption,name); Ftp.list(list); arr1 := explode(name+' ',list.text); arr2 := explode(#13#10,arr1[1]); while(arr2[0] = '') do begin list.Clear; Ftp.list(list); arr1 := explode(name+' ',list.text); arr2 := explode(#13#10,arr1[1]); end; tmp1:='http://ul.to/'+arr2[0]; Ftp.Disconnect; list.Free; except on E : Exception do begin ShowMessage('FTPException class name = '+E.ClassName); ShowMessage('FTPException message = '+E.Message); end; end; ftp.Free; |
Re: Problem mit D2009 und IdFTP
Zum Einen sollte man dynamisch erzeugte Objekte immer in try-finally einbetten, um Speicherlecks zu vermeiden.
Delphi-Quellcode:
Dann greifst Du auf Elemente der Arrays(?) arr1 und arr2 zu, ohne vorher zu prüfen, ob diese überhaupt befüllt sind. Ansonsten zeig uns doch einmal, in welcher Zeile die Exception auftritt.
Bla := TBla.Create;
try //Mach was mit Bla finally Bla.Free; end; |
Re: Problem mit D2009 und IdFTP
Zitat:
Die Try Finally existieren schon, hab nur das aus dem code rauskopiert wo das problem liegen muss. Kann das an einem Leeren Array liegen das es eine Exception "Lesen von Adresse 00000" auftritt? Die Explode funktion hab ich hier aus der CodeLibrary wenn ich mich recht erinnere:
Delphi-Quellcode:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var SepLen: Integer; F, P: PChar; ALen, Index: Integer; begin SetLength(Result, 0); if (S = '') or (Limit < 0) then Exit; if Separator = '' then begin SetLength(Result, 1); Result[0] := S; Exit; end; SepLen := Length(Separator); ALen := Limit; SetLength(Result, ALen); Index := 0; P := PChar(S); while P^ <> #0 do begin F := P; P := AnsiStrPos(P, PChar(Separator)); if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F); if Index >= ALen then begin Inc(ALen, 5); SetLength(Result, ALen); end; SetString(Result[Index], F, P - F); Inc(Index); if P^ <> #0 then Inc(P, SepLen); end; if Index < ALen then SetLength(Result, Index); end; |
Re: Problem mit D2009 und IdFTP
Versuch doch erst einmal, die Längen der Arrays zu prüfen, bevor Du zugreifst.
Delphi-Quellcode:
Das dann an allen entsprechenden Stellen, an denen die Arrays vor erneutem Zugriff geändert wurden.
if Length(arr2) > 0 then
while(arr2[0] = '') do |
Re: Problem mit D2009 und IdFTP
Hab ich nun gemacht, ändert leider nichts =/
|
Re: Problem mit D2009 und IdFTP
Dann gehen mir auch so langsam die Ideen aus, da ja auch die fehlerverursachende Zeile nicht bekannt ist. Die Speicheradresse in der Fehlermeldung deutet zumindest darauf hin, dass auf ein nicht instanziertes Objekt zugegriffen werden soll oder etwas in der Art.
|
Re: Problem mit D2009 und IdFTP
Zitat:
Ist dir vllt eine Methode bekannt die Fehlerverursachende zeile nach dem Compilieren, also ausserhalb der IDE herauszufinden? |
Re: Problem mit D2009 und IdFTP
Spontan fällt mir da
![]() |
Re: Problem mit D2009 und IdFTP
... oder alle Schritte in einer Log-Datei mitprotokollieren. Zwischen dem
letzten geschriebenen und dem nächsten nicht mehr protokollierten liegt der Hase im Pfeffer. Wenn die Aktionen manuell gestartet werden, also keine While-Schleife, kannst Du das auch über ShowMessage(..) eingrenzen. Außerdem würde ich keine geschützten Begriffe wie "name" oder "index" als Variablenbezeichnung einsetzen. Besser wäre z.B. "sName" oder "iIndex" o.ä. |
Re: Problem mit D2009 und IdFTP
Ist gelöst, worans nun wirklich lag kann ich aber leider nicht sagen^^
Einen Tag lang rumprobieren hat geholfen^^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 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