AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Return value of Function 'SendEmail' might be undefined
Thema durchsuchen
Ansicht
Themen-Optionen

Return value of Function 'SendEmail' might be undefined

Ein Thema von Natcree · begonnen am 9. Dez 2013 · letzter Beitrag vom 10. Dez 2013
Antwort Antwort
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#1

Return value of Function 'SendEmail' might be undefined

  Alt 9. Dez 2013, 21:51
Habe ne Fehlermeldung krieg Sie nicht weg.

Return Value of Function 'SendEmail' might be undefined.

Hiermal der Code

Delphi-Quellcode:
function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  dwRet := MapiLogon(Handle,
    PChar(''),
    PChar(''),
    MAPI_LOGON_UI or MAPI_NEW_SESSION,
    0, @MAPI_Session);

  if (dwRet <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,
      PChar('Error while trying to send email'),
      PChar('Error'),
      MB_ICONERROR or MB_OK);
  end
  else
  begin
    FillChar(MapiMessage, SizeOf(MapiMessage), #0);
    Attachments := nil;
    FillChar(Receip, SizeOf(Receip), #0);

    if Mail.Values['to'] <> 'then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := StrNew(PChar(Mail.Values['to']));
      Receip.lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['to']));
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;

    AttachCount := 0;

    for i1 := 0 to MaxInt do
    begin
      if Mail.Values['attachment' + IntToStr(i1)] = 'then
        break;
      Inc(AttachCount);
    end;

    if AttachCount > 0 then
    begin
      GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);

      for i1 := 0 to AttachCount - 1 do
      begin
        FileName := Mail.Values['attachment' + IntToStr(i1)];
        Attachments[i1].ulReserved := 0;
        Attachments[i1].flFlags := 0;
        Attachments[i1].nPosition := ULONG($FFFFFFFF);
        Attachments[i1].lpszPathName := StrNew(PChar(FileName));
        Attachments[i1].lpszFileName :=
          StrNew(PChar(ExtractFileName(FileName)));
        Attachments[i1].lpFileType := nil;
      end;
      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := @Attachments^;
    end;

    if Mail.Values['subject'] <> 'then
      MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
    if Mail.Values['body'] <> 'then
      MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));

    WndList := DisableTaskWindows(0);
    try
    Result := MapiSendMail(MAPI_Session, Handle,
      MapiMessage, MAPI_DIALOG, 0);
    finally
      EnableTaskWindows( WndList );
    end;

    for i1 := 0 to AttachCount - 1 do
    begin
      StrDispose(Attachments[i1].lpszPathName);
      StrDispose(Attachments[i1].lpszFileName);
    end;

    if Assigned(MapiMessage.lpszSubject) then
      StrDispose(MapiMessage.lpszSubject);
    if Assigned(MapiMessage.lpszNoteText) then
      StrDispose(MapiMessage.lpszNoteText);
    if Assigned(Receip.lpszAddress) then
      StrDispose(Receip.lpszAddress);
    if Assigned(Receip.lpszName) then
      StrDispose(Receip.lpszName);
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;// Die letzte Zeile gibt er mir an
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Return value of Function 'SendEmail' might be undefined

  Alt 9. Dez 2013, 21:56
Die Meldung bedeutet, dass der Rückgabewert der Funktion möglicherweise undefiniert ist. Um den Fehler zu entfernen, könntest du zu Beginn der Funktion einfach Result := 0 schreiben. Dann ist der Rückgabewert der Funktion garantiert schon einmal 0 sofern während der weiteren Ausführung ein Fehler autritt und Result nicht neu gesetzt wird.
  Mit Zitat antworten Zitat
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Return value of Function 'SendEmail' might be undefined

  Alt 9. Dez 2013, 21:58
Danke Dir Fehler ist Weg. Ich habe es auch damit schon versucht aber am ende der function.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

AW: Return value of Function 'SendEmail' might be undefined

  Alt 9. Dez 2013, 23:57
Ich habe es auch damit schon versucht aber am ende der function.
Das sollte auch gehn und die Meldung weg sein.

Nur daß dann der Compiler sagen sollte, daß der Rückgabewert von MapiSendMail umsonst an Result zugewiesen wird.

Delphi-Quellcode:
if (dwRet <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,
      PChar('Error while trying to send email'),
      PChar('Error'),
      MB_ICONERROR or MB_OK);
  end
Eigentlich ghört das fehlende Result := ...; dort rein, denn hier fehlt die Zuweisung an Result, wärend es im Else-Zweig via MapiSendMail gesetzt wird.

Und nein, 0 ist hier ein total falsches Ergebnis, denn MapiSendMail (wie man im MSDN nachlesen kann) liefert im Erfolgsfall auch eine 0. Genauer SUCCESS_SUCCESS, welche wie S_OK und NOERROR = 0 ist.

Also wenn, dann sollte man Result dort auf MAPI_E_FAILURE oder besser noch MAPI_E_LOGIN_FAILURE setzen, da es ja einen Fehler bei MapiLogon angibt.
Aber ich würde Result da auf dwRet setzen, also den "korrekten" Fehlercode. Oder dwRet gleich weglassen und direkt Result verwenden.


Und die vielen StrDispose gehören wohl eher in ein Try-Finally, also ins Finally und das Try nach dem zweiten FillChar.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 9. Dez 2013 um 23:59 Uhr)
  Mit Zitat antworten Zitat
Natcree

Registriert seit: 5. Mär 2013
502 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Return value of Function 'SendEmail' might be undefined

  Alt 10. Dez 2013, 00:17
Ich weiss nicht ob es so richtiger Wär

oben im Code habe ich das geändert

Delphi-Quellcode:
  Result := MAPI_E_LOGIN_FAILURE;
  dwRet := MapiLogon(Handle,PChar(''),PChar(''),MAPI_LOGON_UI or MAPI_NEW_SESSION,
  0, @MAPI_Session);
  if (dwRet <> SUCCESS_SUCCESS) then begin
    MessageBox(Handle,PChar('Error while trying to send email'),PChar('Error'),
    MB_ICONERROR or MB_OK);
  end
  else
und unten

Delphi-Quellcode:
  if Assigned(MapiMessage.lpszSubject) then try
  StrDispose(MapiMessage.lpszSubject); finally
  if Assigned(MapiMessage.lpszNoteText) then try
  StrDispose(MapiMessage.lpszNoteText); finally
  if Assigned(Receip.lpszAddress) then try
  StrDispose(Receip.lpszAddress); finally
  if Assigned(Receip.lpszName) then try
  StrDispose(Receip.lpszName); finally
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;
end;
end;
end;
end;

so jetzt Hagelt es spottt
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Return value of Function 'SendEmail' might be undefined

  Alt 10. Dez 2013, 04:54
So ein Fehler/Warnung schleicht sich schnell mal ein bei solchen Spagetti Code ein. Und da du selbst den "Fehler" nicht gesehen hast, ist das ein Zeichen da für, dass du selbst etwas den Überblick verloren hast.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

AW: Return value of Function 'SendEmail' might be undefined

  Alt 10. Dez 2013, 10:06
so jetzt Hagelt es spottt
1 Try-Finally um alle Dispose hätte bestimmt ausgereicht.
> dort im Finally sollte es hoffentlich nicht knallen und wenn doch, dann hat es vorher den Speichermanager total zerschossen und da nun ist eh alles egal zu spät.

Da die Variablen (wo die Speicher reserviert/verwaltet werden) vorher mit nil (0) initilisiert und innerhalb des try-finally reserviert werden, können die dann "problemlos" zusammen im finlly-end freigegeben werden, da bis dahin auch alle variablen auch ordentlich initialisiert wurden
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (10. Dez 2013 um 10:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Return value of Function 'SendEmail' might be undefined

  Alt 10. Dez 2013, 14:12
so jetzt Hagelt es spottt
Eben.
Was ist das denn für eine Fehlerbehandlung?
Delphi-Quellcode:
    MessageBox(Handle,
      PChar('Error while trying to send email'),
      PChar('Error'),
      MB_ICONERROR or MB_OK);
Das ist viel zu ungenau und ausserdem sollte man bei Fehler Exceptions verwenden.
Delphi-Quellcode:
// z.B. so
raise Exception.CreateFmt('can''t open MAPI to send email'#13#10'return code was %d', [dwRet])
So weiss man zumindest dass MAPI verwendet wird und man kennt den Returncode.
Optimalerweise übersetzt man die MAPI Returncodes noch in Klartext und verwendet eine eigene Exception-Klasse.
Was würde wohl passieren falls jemand diesen Code schreibt und MAPI nicht richtig eingerichtet ist?
Delphi-Quellcode:
for i := 1 to 2000 do
  SendEMail(self.Handle, mailinglist);
Man müsste 2000 Mal eine Fehlermeldung bestätigen ohne zu wissen wie oft man noch klicken muss.
Dann kann man das Programm nur noch mit dem Taskmgr abschiesen.
Mit einer Exception kommt die Fehlermeldung nur einmal und die Schleife und alles davor wird abgebrochen weil es eh sinnlos ist bei dem Fehler weiterzumachen.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

AW: Return value of Function 'SendEmail' might be undefined

  Alt 10. Dez 2013, 15:56
Was ist das denn für eine Fehlerbehandlung?
Das ist viel zu ungenau und ausserdem sollte man bei Fehler Exceptions verwenden.
Im Prinzip würde man hier
- entweder die MessageBox weg machen und dwRes als Result zurückliefern, denn der fehlervor vom MapiSendMail wird auch nicht geprüft und nur zurückgegeben
=> Fehlerbehandlung dann beim Aufrufer, indem er das Result von SendEMail prüft

- oder eine Exception statt der MessageBox, aber dann auch sofort das Ergebnis von MapiSendMail prüfen und ebenfalls eine exception werfen.
=> hier kommt das Result dann weg und es wird eine Prozedur daraus
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz