Entwickler-Ecke
Sonstiges (Delphi) - Auf Access violation prüfen
hui1991 - So 07.01.07 13:32
Titel: Auf Access violation prüfen
Ich hab mit der Funktion SendPostData (im dsdt.info) versucht eine Seite zu öffnen.
Da wenn mein Modem spinnt und das Programm an ist soll keine Fehlermeldung erscheinen.
Um das Spinnen selber zu machen, habe ich der Firewall gesagt die soll das Programm blocken ^^
Dann hab ich mir gedacht ich mach eine If-Abfrage.
Blos das ist ein Int64 wert (lStream.Size).
Beim Debuggen hatte ich festgestellt, wenn das zugreifen auf der Seite fehlschlägt, bekommt lStream.Size diesen wert:
lStream.Size: Access violation at 009F1FA4 accessing 00000000
Wie schaffe ich es das ich darauf überprüfe, das dann keine Fehlermeldung auftritt, wenn ich auf diesen Wert zugreifen will? Ich hab schon if lStream.Size<1 versucht, da kommt, aber auch ein Error...
Das ist die FUnktion die ich verwende:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| function SendPostData(Ahttp: TIdHTTP; const AtoURL: String; const aParams: TStrings): String; Var lStream: TMemoryStream; lParams: TStringStream; I: Integer; begin Result:=''; if not Assigned(aHttp) then exit; lStream := TMemoryStream.create; lParams := TStringStream.create(''); try AHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
for I:=0 to aParams.Count-1 do lParams.WriteString(aParams[I] + '&');
try AHTTP.Post(AtoURL, lParams, lStream); except on E: Exception do showmessage('Fehler bei der Übertragung: ' + E.Message); end; SetLength(Result,lStream.Size); lStream.Position:=0; lStream.ReadBuffer(Result[1],lStream.Size); finally lParams.Free; lStream.Free; end; end; |
Aus: [url=
http://dsdt.info/tipps/?id=455]
Per POST Daten an Scripts senden[/url]
MfG
hui1991
JayEff - So 07.01.07 13:58
Titel: Re: Auf Access violation prüfen
hui1991 hat folgendes geschrieben: |
Beim Debuggen hatte ich festgestellt, wenn das zugreifen auf der Seite fehlschlägt, bekommt lStream.Size diesen wert:
lStream.Size: Access violation at 009F1FA4 accessing 00000000 |
Einw Integervariable bekommt einen String als Wert?? Erstaunlich ... :shock:
Wie auch immer, versuche doch mit einem weiteren try-except block zu arbeiten, also
try wasweisichwasdumitsizemachst except showmessage('Verbindungsfehler'); end;
hui1991 - So 07.01.07 14:44
Dein Vorschlag hab ich ausprobiert, dann öffnete sich der CPU und ich musste die Anwendung mit Strg+F2 beenden.
ICh hab, das dann so gelöst:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| function SendPostData(Ahttp: TIdHTTP; const AtoURL: String; const aParams: TStrings): String; Var lStream: TMemoryStream; lParams: TStringStream; I, er: Integer; begin er:=0; Result:=''; if not Assigned(aHttp) then exit; lStream := TMemoryStream.create; lParams := TStringStream.create(''); try AHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
for I:=0 to aParams.Count-1 do lParams.WriteString(aParams[I] + '&'); try AHTTP.Post(AtoURL, lParams, lStream); except on E: Exception do er:=1; end; if er=0 then begin SetLength(Result,lStream.Size); lStream.Position:=0; lStream.ReadBuffer(Result[1],lStream.Size); end else Showmessage('Es ist ein Fehler aufgetretten'); finally lParams.Free; lStream.Free; end; end; |
So müsste es dann klappen und bis jetzt sind keine Fehler aufgetretten ^^
Denke das problem ist gelöst.
Vllt kennt jemand eine bessere Lösung.
Soweit ich den Stringwert im Debuger kenne sind Strings mit '' gekennzeichnet, da aber bei dem Fehler kein '' ist, heißt es doch es ein Fehler ist, und zeigt an was für ein Fehler aufgetretten ist ^^
JayEff - So 07.01.07 18:24
Was auch immer dein letzter Satz bedeuten sollte...
Deine Lösung ist auf jeden fall ziemlich elegant, nur würd ich er als boolean definieren und das on E:Exception do kannst du weglassen, das brauchst du nur, wenn du mit dem E Objekt weiterarbeiten willst.
hui1991 - So 07.01.07 19:52
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| function SendPostData(Ahttp: TIdHTTP; const AtoURL: String; const aParams: TStrings): String; Var lStream: TMemoryStream; lParams: TStringStream; I: Integer; er: boolean; begin er:=False; Result:=''; if not Assigned(aHttp) then exit; lStream := TMemoryStream.create; lParams := TStringStream.create(''); try AHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
for I:=0 to aParams.Count-1 do lParams.WriteString(aParams[I] + '&'); try AHTTP.Post(AtoURL, lParams, lStream); except er:=True; end; if not er then begin SetLength(Result,lStream.Size); lStream.Position:=0; lStream.ReadBuffer(Result[1],lStream.Size); end else Showmessage('Es ist ein Fehler aufgetretten'); finally lParams.Free; lStream.Free; end; end; |
Denke so ist es besser ^^
hui1991 - So 14.01.07 13:00
Okay, mir hat gerade eben die Firewall das gesammte Internet gekappt.
Ich hab im hintergrund noch das Programm gehabt und in diesem Augenblick wollte er drauf zugreifen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| function SendPostData(Ahttp: TIdHTTP; const AtoURL: String; const aParams: TStrings): String; Var lStream: TMemoryStream; lParams: TStringStream; I: Integer; er: boolean; begin er:=False; Result:=''; if not Assigned(aHttp) then exit; lStream := TMemoryStream.create; lParams := TStringStream.create(''); try AHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
for I:=0 to aParams.Count-1 do lParams.WriteString(aParams[I] + '&'); try AHTTP.Post(AtoURL, lParams, lStream); except er:=True; end; if not er then begin SetLength(Result,lStream.Size); lStream.Position:=0; lStream.ReadBuffer(Result[1],lStream.Size); end else Showmessage('Es ist ein Fehler aufgetretten'); finally lParams.Free; lStream.Free; end; end; |
Auf der Markierten stelle kam eine Access Violation, mit irgendeiner fehler wert usw.
Das passiert auch dort. Wenn ich im finally auch das mit er überprüfe springt er auf end; und löst dort den Fehler aus.
Was kann ich dagegen machen?
Wie kann ich davor schon überprüfen ob es eine Verbindung zum Internet gibt?
MfG
hui1991
JayEff - So 14.01.07 15:15
Fehler tret
ten nicht auf ;)
Delphi-Quelltext
1: 2: 3: 4: 5:
| IdHTTP1.Host := '127.0.0.1'; Try IdHTTP1.Connect(5000); Except showmessage('asd'); End; |
Das ist nicht elegant und funktioniert auch nur dann, wenn die Firewall (wie ZoneAlarm) die Verbindung komplett unterdrückt. Aber naja... das einzige was mir einfällt ... :/
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!