Autor Beitrag
adrian4321
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Win2000, Linux (Suse9.0)
D5 Prof, D7 Pers, K3 OE
BeitragVerfasst: Do 12.02.04 19:27 
Hallo Leute,

ich bin am Verzweifeln. Der Indykomponente TIdMessage wurde eine frisch empfangene eMail uebergeben. Alle Eigenschaften wie Body etc. sind auslesbar, jedoch erscheint bei Message.SaveToFile eine EAccessViolation.
Die Datei wird trotzdem geschrieben, der Inhalt scheint komplett zu sein.
Mit dem von Indy bereitgestellten Beispiel MessageLoadSave lassen sich eMails generieren (Angabe von Body, Adressen, Header....); diese sind problemlos abzuspeichern. Oeffne ich mit dem Beispielprogramm meine erzeugte Datei die den Fehler verursachte, geht das problemlos, wenn ich die jedoch mit dem Indy Beispiel unter einem anderen Namen wieder speichere gibt es wieder eine EAccessViolation.... :roll:

Ich habe das auf 3 versch. Rechnern probiert, mit / ohne allen Delphi5 Updates. Ein Bug bei Indy?

Hier mein Quelltext:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.getAndSaveClick(Sender: TObject);
begin
msg.Clear;
pop.Connect;
if pop.CheckMessages > 0 then
begin
 pop.Retrieve(0, msg);
 pop.disconnect;
 msg.SaveToFile('c:\test.msg');
end;
end;


"Zugriffsverletzung bei 00000032. Lesen von Adresse 00000032." Lautet der Fehler.

Fuer Hilfe bin ich dankbar!
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: Fr 13.02.04 08:11 
Ich habe mir das gestern angeschaut und kann den Fehler bestätigen. Der erstellte Stream wird 2mal freigegeben und erzeugt bei der 2ten Freigabe den Zugriffsfehler, was so auch stimmt. Um den Fehler auszumerzen, must Du den Quellcode von Indy ändern.

Dazu must Du die Datei IdMessage ändern und zwar die Methode SaveToStream(AStream: TStream; const AHeadersOnly: Boolean = False).
In dem Abschnit
ausblenden Delphi-Quelltext
1:
2:
3:
4:
    try
      LIOHS.OutputStream := AStream;
      LMsgClient.IOHandler := LIOHS;
      LMsgClient.OpenWriteBuffer(32768);

muss nach dem LIOHS.OutputStream eine neue Zeile eingefügt werden.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
    try
      LIOHS.OutputStream := AStream;
      LIOHS.FreeStreams := False;
      LMsgClient.IOHandler := LIOHS;
      LMsgClient.OpenWriteBuffer(32768);


Die Meldung taucht nicht mehr auf, jedoch glaube ich, das dadurch ein Stream nicht mehr entfernt wird. Eventuell must Du noch den InputStream von LIOHS manuell freigeben.

Gruß
KidPaddle
adrian4321 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Win2000, Linux (Suse9.0)
D5 Prof, D7 Pers, K3 OE
BeitragVerfasst: Fr 20.02.04 15:30 
Titel: EAccessViolation
Genau das wars - in einer neueren Version von Indy9 steht genau diese Zeile drin....

Vielen Dank fuer die Hilfe!

Adrian