Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi EMails auslesen mit Simple MAPI (https://www.delphipraxis.net/140343-emails-auslesen-mit-simple-mapi.html)

nahpets 21. Sep 2009 11:43

Re: EMails auslesen mit Simple MAPI
 
Hallo,
Zitat:

Zitat von hathor
Ich bekomme 2 Fehlermeldungen:

[Pascal Hint] FormMain.pas(70): H2077 Value assigned to 'Err' never used
[Pascal Hint] FormMain.pas(75): H2077 Value assigned to 'Err' never used

das sind "nur" Warnungen, man könnte auf die Zuweisung der Rückgabewerte von
Delphi-Quellcode:
Err := MapiLogOn(Handle, '', '', MAPI_EXPLICIT_PROFILE, 0, @SessionID);
Delphi-Quellcode:
Err := MapiFreeBuffer(pMsg);
und
Delphi-Quellcode:
Err := MapiFreeBuffer(pMsg);
auch verzichten, da sie für die Weiterverarbeitung (vermutlich?) nicht von Belang sind.

Habe mal die Rückgabewerte protokolliert, sie sind immer 0 = SUCCESS_SUCCESS mit Ausnahme des letzten MapiFindNext, dieses liefert 16 = MAPI_E_NO_MESSAGES. MapiLogOff liefert 0 = SUCCESS_SUCCESS, danach tritt die Ausnahme auf.

Nachdem ich dann den Quelltext noch ein bisserl verändert hatte und vor das Abschließende end; von Button1Click(Sender: TObject), eine ShowMessage('Fehler vorher oder nachher?'); gesetzt hatte, durfte ich Feststellen, dass der Fehler hinter diesem ShowMessage auftritt, mit der "Nebenwirkung", dass man im Debugger nicht mehr über die Zugriffverletzung(en) hinauskommt, jedes F9 führt zu einer weiteren Zugriffsverletzung, die Adresse ändert sich dabei nicht.

Wenn ich das CPU-Fenster richtig interpretiere, tritt der Fehler in TControl.WndProc auf.

Wird hier irgendwo unterwegs was zerschossen?

Katrin 5. Okt 2009 09:34

Re: EMails auslesen mit Simple MAPI
 
Hallo zusammen,

ich habe das Problem jetzt gelöst, weiß aber nicht, warum es so funktioniert und nicht anders.

Als erstes habe ich alle Variablen, die ich für Mapi-Aufrufe brauchte, global definiert.
Danach bekam ich aber wieder den gleichen Fehler wie am Anfang (Variable Session wurde überschrieben).
Wenn ich aber die Session lokal und alle anderen Variablen global definiere, funktioniert es.

Wenn mir das noch jemand erklären könnte ...

Hier ist der funktionierende Quelltext:

Delphi-Quellcode:
var MessID: AnsiChar;
    pMsg: PMapiMessage;
    Err: Cardinal;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
    Session: LHANDLE;
begin
  Err := MapiLogOn(Handle, '', '', MAPI_EXPLICIT_PROFILE, 0, @Session);
  if Err <> SUCCESS_SUCCESS
  then begin
    ShowMessage('Verbindung konnte nicht hergestellt werden! ' + IntToStr(Err));
    Exit;
  end;
  i := 1;
  Err := MapiFindNext(Session, Handle, '', '', MAPI_UNREAD_ONLY, 0, @MessID);
  while Err = SUCCESS_SUCCESS do
  begin
    Err := MapiReadMail(Session, 0, @MessID, MAPI_PEEK, 0, pMsg);
    if Err = SUCCESS_SUCCESS
    then begin
      StringGrid1.Cells[0,i] := MessID;
      StringGrid1.Cells[1,i] := pMsg^.lpOriginator^.lpszName + ' (' + pMsg^.lpOriginator^.lpszAddress + ')';
      StringGrid1.Cells[2,i] := pMsg^.lpszSubject;
      StringGrid1.Cells[3,i] := pMsg^.lpszDateReceived;
      Inc(i);
      Application.ProcessMessages;
    end;

    Err := MapiFindNext(Session, 0, nil, @MessID, MAPI_UNREAD_ONLY, 0, @MessID);
  end;

  MapiFreeBuffer(pMsg);

  MapiLogOff(Session, 0, MAPI_LOGOFF_SHARED, 0);

  StringGrid1.RowCount := Max(i, 2);
end;
Viele Grüße und Danke für Eure Hilfe
Katrin


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.
Seite 2 von 2     12   

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