Entwickler-Ecke

Internet / Netzwerk - IdHTTP verursacht access violation


Chiller - Mi 24.12.08 15:50
Titel: IdHTTP verursacht access violation
hallo

ich programmiere seit ca 3 monaten in der schule mit delphi 6 und bin deshalb noch nichr sehr erfahren, will jedoch ein programm schreiben, dass vorerst nur den quellcode einer website ausliest...
versucht habe ich das mit TIdHTTP, nachdem ich nun schon delphi 2005, 8, 7 personal editon und nun 7 second edition mit einer offentlich geeigneten indy 10 habe...

Mein Code:

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:
unit UHaupt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    a : TIdHTTP;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var httpcode : string;
begin
  httpcode:=a.Get('http://www.google.de');
  Memo1.Text:=httpcode;
end;

end.
wenn ich das programm nun starten will, fragt er mich nach der IdHTTP.pas, deshalb habe ich den Pfad zu der datei in meinem indy-installationsverzeichnis angegeben habe, doch dann kommt:
[quote]Project Versuch.exe raised exeption class EAccessViolation with message 'Access violation at adress 0046F49F in module 'Versuch.exe'. Read at adress 00000000' Process stopped. Use step or turn to continue.[quote]
daraufhin zeigt er hier einen fehler in der IdHTTP.pas an, wobei ein grüner pfeil davor ist:

Delphi-Quelltext
1:
DoRequest(Id_HTTPMethodGet, AURL, nil, AResponseContent, AIgnoreReplies);                    

wenn man die datei außerhalb von delphi ausführ kommt nur die fehlermeldung
Zitat:
"Access violation at adress 0046F49F in module 'Versuch.exe'. Read at adress 00000000"...

ich hoffe jmd von euch kann mir bei diesem problem weiterhelfen...

frohe weihnachten


Chiller

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


Delete - Mi 24.12.08 15:54

Wo wird a denn erzeugt?


stigge - Mi 24.12.08 16:22


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:
unit UHaupt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    a : TIdHTTP;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  a := TIdHTTP.Create(nil);
  Memo1.Text := a.Get('http://www.google.de');
  a.Free;
end;

end.

Hast vergessen zu Erzeugen, außerdem kannst das a.Get()-Ergebnis direkt dem Memo zuweisen.


Yogu - Mi 24.12.08 16:25

Deklariere a : TIdHTTP; lieber in der Prozedur selber. Und a ist ein wirklich aussagekräfiger Name für einen HTTP-Client :roll:


Delphi-Quelltext
 
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
{ ... }
procedure TForm1.Button1Click(Sender: TObject);
var HTTP: TIdHTTP; httpcode : string;
begin
  HTTP := TIdHTTP.Create;
  try
    Memo1.Text := HTTP.Get('http://www.google.de');
  finally
    HTTP.Free;
  end;
end;


Chiller - Mi 24.12.08 17:48

ersteinaml danke für die antworten!
habe es nun umgeschrieben:

Code:



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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    BStart: TButton;
    Memo1: TMemo;
    procedure BStartClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BStartClick(Sender: TObject);
var HTTP: TIdHTTP; httpcode : string;
begin
  HTTP:=TIDHTTP.Create(nil);
  Memo1.Text:=HTTP.Get('http://www.google.de');
  HTTP.Free;
end;

end.




daraufhin sollte ich den pfad der datei IdGlaobalProtocols.pas angeben, und habe die datei wieder in meinem indy-verzeichnis gesucht, auch wenn ich gar nicht weiß weshalb ich diese pas datei überhaupt benötige...

daraufhin kam in der IdGlobalProtocols.pas in dieser zeile wieder eine fehlermeldung:


Dt := Sys.StrToInt( Fetch(Value, ADelim), 1);


was habe ich falsch gemacht?


n-regen - Mi 24.12.08 18:05

Auf jeden Fall solltest du in deinem Post mal den Quelltext in ein Delphi-Tag packen (Quelltext markieren und dann über dem Textfeld auf "Bereiche" und dann "+" klicken).

user profile iconChiller hat folgendes geschrieben Zum zitierten Posting springen:
was habe ich falsch gemacht?

Nichts.
Die Indy-Units rufen sich aber gegenseitig auf (deswegen hat dich Delphi nach der IdGlobalProtocols.pas gefragt). Damit Delphi die Dateien selber findet, solltest du den Ordner, in dem du Indy installiert hast, als sogenannten Bibliothekspfad hinzufügen. Dazu klickst du in Delphi (ich gehe jetzt mal von Delphi 7 aus) im Menü auf "Tools" und dann "Umgebungsoptionen", wählst den Reiter "Bibliothek" aus, klickst auf das "..." neben dem Feld "Bibliothekspfad", gibst in das Feld unten C:\Programme\Indy 10\LibD7 (oder den Ordner, in den du die Indys installiert hast) ein und klickst auf "Hinzufügen" und dann zwei mal auf "OK".
Danach sollte Delphi dich eigentlich nicht mehr nach den Units fragen.

Nils

Ach ja: Frohe Weihnachten!


Chiller - Mi 24.12.08 18:22

user profile iconn-regen hat folgendes geschrieben Zum zitierten Posting springen:
Auf jeden Fall solltest du in deinem Post mal den Quelltext in ein Delphi-Tag packen (Quelltext markieren und dann über dem Textfeld auf "Bereiche" und dann "+" klicken).


ich wusste nicht wie es geht, doch in zukunft werde ich es machen :-)

habe ich gemacht...doch er fragt mich wieder nach dem pfad der IdglobalProtocols.pas...ich ahbe nachgeschaut, in dem order LibD7 befindet sich nur die datei IdGlobalProtocols.dcu...aber das müsste doch eigentlich reichen....


Chiller

Moderiert von user profile iconNarses: Zitat repariert


Chiller - Fr 26.12.08 15:44

hat niemand eine lösung für mein problem...?


Chiller - So 28.12.08 21:05

ich fände es auf jeden fall nett wenn amn mir überhaupt sagen kann was sache ist, ich befürche dass die indy nicht ganz ok ist, da sich die IdGlobalprotocols.duc in dem ordner befindet...doch wie schon erwähnt habe ich davon gar keine ahnung und bin für jede hilfe dankbar...

wenn ihr also irgend etwas wisst, sei es noch so dumm oder abwegig, sagt es mir bitte, sonst komme ich nämlich nicht weiter!


jaenicke - So 28.12.08 21:09

Mit der .dcu kann Delphi offenbar nichts anfangen, und das ist der Fall, wenn diese von einer anderen Version von Delphi stammt. ;-)
Eigentlich sollte die .pas Datei aber auch irgendwo dabei sein, es ist ja ein Open Source Projekt.

Welchen Ordner hast du denn jetzt im Suchpfad eingetragen?


Chiller - Mo 29.12.08 13:56

C:\Programme\Indy 10 for Delphi 7\LibD7

das ist der pfad zu der indy mit den entsprechenden dcu's, der mir schon von delphi vorgeschalgen wurde...und trotzdem geht es nicht...!


wenn ich die pas so aus dem anderen ordner auswähle, kommt auch eine fehlermeldung, in der IdGlobalProtocols.pas...!


jaenicke - Mo 29.12.08 14:22

Füge den anderen Ordner mit den .pas Dateien auch zum Pfad hinzu. Am besten einfach alle Odner mit .pas Dateien im Indyverzeichnis, ich weiß nicht wie das bei dir aussieht. Ich habe da 4 Ordner jeweils mit Packages und .pas Dateien (Core, Protocols, SuperCore, System).

Hast du einen Autoinstaller benutzt? Das habe ich noch nie gemacht, keine Ahnung was der macht.


Chiller - Mo 29.12.08 14:30

ich hatte nur eine datei die ich installiert habe..eine .exe und mehr musste ich nciht tun, in dem ordner waren auch noch noch 2 dll's...

bei mir sieh das so aus [url=http://img515.imageshack.us/my.php?image=screendephi7ji2.jpg]user defined image[/URL]

ich weiß jetzt nur wie bzw wo ich die anderen parts angeben soll!


jaenicke - Mo 29.12.08 14:48

Also bei mir sieht das Indy Verzeichnis so aus:
user defined image
In dem Fall wären es die vier markierten Verzeichnisse, die in den Pfad gehören, eben die, in denen sich die .pas Dateien befinden.

Was genau der Autoinstaller da installiert weiß ich nicht, ich halte nichts davon und habe ihn nie ausprobiert. :nixweiss:


Chiller - Mo 29.12.08 14:58

bei mir sieht das so aus...

[url=http://img230.imageshack.us/my.php?image=ordnerdephimn9.png]user defined image[/URL]


du siehst ja auf dem anderne bild wie es bei mir in delphi aussieht, jetzt kann ich dort nur einen ordner angeben, und nicht mehrere...deshalb weiß ich nicht wie die anderen ordner, die man ja oben auf dem bild sieht, angeben soll!


jaenicke - Mo 29.12.08 15:09

Nacheinander, und jeweils auf Add klicken... :roll:


Chiller - Mo 29.12.08 16:05

ok, danke, das habe ich jetzt gemacht, dachte zuvor ich würde dann den pfad, der shcon dasteht ersetzen, da das add noch nicht"enabled"^^ war, kleiner denkfehler, dem ist ja aber nicht so...

nun kommt jedoch folgende fehlermeldung wenn ich mein programm ausführe:


Project project1.exe raised exeption class EConvertError with message 'Invalid argument to date encore.' Process stopped. Press run or stop to continue.

dabei wird in der IdGlobalProtocols.pas am ende sier Zeile ein fehler anzezeigt

Result := Sys.EncodeDate(Yr, Mo, Dt);


mein code sieht dabei so aus:


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:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    BStart: TButton;
    Memo1: TMemo;
    procedure BStartClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BStartClick(Sender: TObject);
var HTTP: TIdHTTP;
begin
  HTTP:=TIDHTTP.Create(nil);
  Memo1.Text:=HTTP.Get('http://www.google.de');
  HTTP.Free;
end;

end.



ich hoffe du/jmd kann mir helfen, was ich jetzt noch tun muss...die pas hat er jetzt ja schon mal gefunden...jetzt weiß ich nur noch nicht wo der fehler liegt...!


jaenicke - Mo 29.12.08 16:17

Da sehe ich erstmal keinen Fehler. :nixweiss:

Die Fehlermeldung sagt mir im Moment nichts, keine Ahnung wo die her kommt.


Chiller - Mo 29.12.08 16:18

hm, ok...kannd ie indy irgendwie beschädigt sein...!


jaenicke - Mo 29.12.08 16:23

Ich weiß wie gesagt nicht, was der Autoinstaller macht, aber eigentlich gehe ich davon aus, dass der funktioniert. Ich nutze Delphi 7 so gut wie nicht mehr wegen der im Vergleich unkomfortablen Oberfläche, aber ich kann man schauen, ob ich was finde. Im virtuellen PC hab ich D7 ja noch.

Es gibt da ja auch Probleme auf der Website, da funktioniert ja kaum ein Download, was das Testen erschwert.


Chiller - Mo 29.12.08 16:26

wie oben shcon geschrieben benutze ich delphi 7 eigentlich nur weil ich die idhttp brauche...und die bei der professional der delphi 7 dabei ist, auch wenn ich die nicht habe und dann aber die indy 10 für delphi 7 gefundne und installiert habe...!

wäre aber nett, danke... :-)


in der schule benutzen wir leide rnoch delphi 6 :-|


jaenicke - Mo 29.12.08 16:29

Wenn das so ist probier doch einfach mal Turbo Delphi aus, wenn es dir um Delphi 7 gar nicht geht. Da ist Indy schon dabei und kostenlos ists auch.
http://www.delphi-library.de/viewtopic.php?t=88835
Die Oberfläche ist allerdings etwas anders (besser) als bei D6 oder D7.


Chiller - Mo 29.12.08 16:32

wenn da auch die IdHTTP dabei ist mache ich das gerne, ich probiere es jetzt und geb dann rückmeldung ;-)


jaenicke - Mo 29.12.08 16:38

Ja, die Internetkomponenten wie TIdHttp sind genau wie Datenbankkomponenten usw. dabei und fertig installiert. Du kannst nur keine zusätzlichen Packages installieren, musst weitere Komponenten also per Code erzeugen. Mehr dazu steht auch in dem Link. ;-)


Chiller - Mo 29.12.08 20:50

habe nun turbo delphi installiert, nur mit dem unterschied dass ich die datei aus der mail genommen habe, in die C:\Programm\Dokumente\Benutzer rein habe...das geht aber auch, kann turbo delphi problemlos ausführen...


wenn ich jetzt wieder mal meinen quellcode ausführen will:



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:
unit UHaupt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdHTTP, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var HTTP:TIdHTTP;
begin
  HTTP:=TIdHTTP.Create(nil);
  Memo1.Text:=HTTP.Get('htp://google.de');
  HTTP.free;
end;

end.



kommt erst die fehlermeldung

Im Project Project1.exe ist eine Exeption der Klasse EIdUnknownProtocol mit der Meldung 'Unknown Protocol' aufgetreten!

als möglichkeiten gibt es nur fortsetzen, anhalten, und hilfe, wobei die nichts bringt...man könnte es auch in zukunft ignorieren, was ich ejdoch gar nciht erst probiert habe da es mich ja wohl nicht weiterbringt...

wenn man das fenster shcleißt kommt wie erwartet das fenster mit Unknown Protocol...

außerdem tritt ganz unten bei ereignisprotocol folgender fehler auf:

Erste gelegenheit für Exeption bei (dollarzeichen)7C81EB33. Exeption Klasse EIdUnknownProtocol mit der Meldung 'Unknown Protocol'. Proces project1.exe(3148).


Ich hoffe mir kann jmd helfen...wenn ihr nur irgendetwas wisst, bitte sagen :-)

danke!


jaenicke - Mo 29.12.08 20:57

user profile iconChiller hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  Memo1.Text:=HTTP.Get('htp://google.de');                    
;-)

Das Protokoll ist hier HTTP, FTP, etc., das am Anfang der Adresse immer steht. Und dieses gibt es nicht. ;-)


Chiller - Mo 29.12.08 21:19

:D ich dachte nicht dass er wegen so etws simplem so ne fehlermeldung rausgibt...in delphi 6 hätte es wohl einfach geheißen unknown...


aber egal, es geht immer noch nicht...nun kommt die fehlermeldung:


Im Project1.exe ist eine exeption der Klasse EIdHTTPProtocolExeption mit der Meldung 'HTTP/1.1 301 Moved Permanently' aufgereten...und eben daras wieder das gleiche wie bei den fehlermeldungen zuvor bei ereignisprotocol etc...!

nun also schon wieder die frage, was ist falsch/was muss ich ändern!?!?!?!


jaenicke - Mo 29.12.08 21:22

Du hast kein www. angegeben, und deshalb gibt der Server zurück, dass die Seite permanent an anderer Stelle zu finden ist (unter www.google.de).
Setze mal HandleRedirects auf True, dann sollte die Weiterleitung auf www.google.de automatisch funktionieren.


Chiller - Mo 29.12.08 21:36

ich könnte heulen:

nachdem ich jetzt HTTP.HandleRedirects:=true; eingefügt ahbe kommt jetzt folgende fehlermeldung:

Im Project1.exe ist eine Exeption der Klasse ERangeERROR mit der Meldung 'Fehler der Bereichsprüdung' aufgetreten...und dazu wieder das übliche..:-(


bin immernoch für hilfe sehr dankbar :-)


jaenicke - Mo 29.12.08 21:41

Das tritt bei mir auch auf. :shock:
Aber nur bei Google. Haben die da etwa was eingebaut, um nicht als Testobjekt missbraucht zu werden? :lol:

Ich kann mal schauen, ob ich herausfinde woran das liegt, aber jedenfalls tritt es bei mir nur bei Google auf, wo ich das bisher nicht bemerkt habe. Wozu sollte ich normalerweise auch google.de herunterladen? :D

// EDIT:
Das Problem ist, dass im Header Expires auf -1 gesetzt wird. Dies verursacht den Fehler.
Leider tritt er durch das Debuggen nicht auf, so dass ich die genaue Fehlerstelle gerade nicht sehe, aber ich schaue gerade noch.


Chiller - Mo 29.12.08 22:08

:D danke, ja, mit ner anderen seite klappt es...es muss aber nicht mit google sein, du musst nicht schauen, ich ahb einfahc nur google aus tetzwecken eingegeben...!


VIELEN DANK!!!!!!