Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Outlook - Ansteuerung (https://www.delphipraxis.net/112572-outlook-ansteuerung.html)

GuenterS 23. Apr 2008 16:08


Outlook - Ansteuerung
 
Hallo,

ich versuche aus Delphi (Version 5 Enterprise) Aufgaben in Outlook zu erstellen. Das klappt auch wunderbar, solange Outlook dabei gestartet ist. Ist dies aber nicht der Fall, krieg ich diese wunderbaren Fehlerberichte.

Vielleicht sieht ja jemand an dem verwendeten Code, wo das Problem zu finden ist.
Delphi-Quellcode:
procedure CreateOutlookTaskItem(aStart, aDueDate, aReminderTime: TDateTime;
   aSubject, aBody: string; aReminder: boolean);
var
   lNamespace, lOutlook, lFolder, lItem: OleVariant;
begin
  try
    loutlook := getactiveoleobject('outlook.application');
  except
    try
      loutlook := createoleObject('outlook.application');
    except
      exit;
    end;
  end;
   try
     lNamespace := lOutlook.getnamespace('MAPI');
     lFolder := lNamespace.getdefaultfolder(13);

     lItem := lOutlook.createitem(3);
     lItem.StartDate := aStart;
     lItem.Subject := aSubject;
     lItem.Body := aBody;
     if (aDueDate <> 0) then
        lItem.DueDate := aDueDate;
     lItem.Categories := 'test';

     if (aReminder) then
     begin
        lItem.ReminderTime := DateTimeToStr(aReminderTime);
       lItem.ReminderSet := true;
     end
     else
        lItem.ReminderSet := false;

     lItem.Save;

     lItem := unassigned;
   finally
     lOutlook := unassigned;
   end;
end;

shmia 23. Apr 2008 17:46

Re: Outlook - Ansteuerung
 
Es fehlt Logon und Logoff.
Delphi-Quellcode:
lNamespace := lOutlook.getnamespace('MAPI');
lNamespace.Logon(EmptyParam, EmptyParam, False, True); // <==
...
lItem.Save;
lNamespace.Logoff;

GuenterS 23. Apr 2008 20:30

Re: Outlook - Ansteuerung
 
Vielen Dank :)

Genau das hat das Problem gelöst :)

[Nachtrag]

Da habe ich mich leider zu früh gefreut... die Fehlerberichtmeldung kommt trotzdem. Anscheinend gibt es Situationen wo diese dann nicht erscheint.


Meine procedure habe ich nun folgendermaßen umgebaut:
Delphi-Quellcode:
procedure CreateOutlookTaskItem(aStart, aDueDate, aReminderTime: TDateTime;
   aSubject, aBody: string; aReminder: boolean);
var
   lNamespace, lOutlook, lFolder, lItem: OleVariant;
begin
  try
    loutlook := getactiveoleobject('outlook.application');
  except
    try
      loutlook := createoleObject('outlook.application');
    except
      exit;
    end;
  end;
   try
     lNamespace := lOutlook.getnamespace('MAPI');
     lNamespace.Logon(EmptyParam, EmptyParam, False, True);
     lFolder := lNamespace.getdefaultfolder(13);

     lItem := lOutlook.createitem(3);
     lItem.StartDate := aStart;
     lItem.Subject := aSubject;
     lItem.Body := aBody;
     if (aDueDate <> 0) then
         lItem.DueDate := aDueDate;
     lItem.Categories := 'test';

     if (aReminder) then
     begin
        lItem.ReminderTime := DateTimeToStr(aReminderTime);
        lItem.ReminderSet := true;
     end
     else
        lItem.ReminderSet := false;

     lItem.Save;
     lNamespace.Logoff;
     lItem := unassigned;
   finally
     lOutlook := unassigned;
   end;
end;


[/Nachtrag]

GuenterS 25. Apr 2008 08:04

Re: Outlook - Ansteuerung
 
Vielleicht sollte ich noch dazusagen, dass ich Outlook 2000 mit Servicepack3 dafür verwende.

Die Aufgabe wird ja richtig angelegt in Outlook, lediglich beim Beenden scheint etwas schiefzugehn.

shmia 25. Apr 2008 13:28

Re: Outlook - Ansteuerung
 
Du hast doch einen integrierten Debugger in Delphi.
Welche Codezeile löst denn die Exception aus ?
OLE Exceptions haben manchmal mehr Informationen zu bieten, als man normalerweise sieht.
Siehe Code-Library: http://www.delphipraxis.net/internal...ct.php?t=22524

Hier nochmal dein Code (ich habe ein paar kleine Fehler entfernt):
Delphi-Quellcode:
procedure CreateOutlookTaskItem(aStart, aDueDate, aReminderTime: TDateTime;
   aSubject, aBody: string; aReminder: boolean);
var
   lNamespace, lOutlook, lFolder, lItem: OleVariant;
begin
  try
    loutlook := getactiveoleobject('outlook.application');
  except
    try
      loutlook := createoleObject('outlook.application');
    except
      // Exit; // nur Exit ist nicht gut. wir wollen schon wissen warum es nicht geklappt hat
      on E:Exception do
      begin
        E.Message := 'Outlook Task kann nicht angelegt werden'#13#10+ E.Message;
        raise;
      end;
    end;
  end;
    lNamespace := lOutlook.getnamespace('MAPI');
    lNamespace.Logon(EmptyParam, EmptyParam, False, True);
    lFolder := lNamespace.getdefaultfolder(13);

    lItem := lOutlook.createitem(3);
    lItem.StartDate := aStart;
    lItem.Subject := aSubject;
    lItem.Body := aBody;
    if (aDueDate <> 0) then
        lItem.DueDate := aDueDate;
    lItem.Categories := 'test';

    if (aReminder) then
    begin
       lItem.ReminderTime := DateTimeToStr(aReminderTime);
       lItem.ReminderSet := true;
    end
    else
       lItem.ReminderSet := false;

    lItem.Save;
    lNamespace.Logoff;

     // lItem := unassigned; // überflüssig, da lokale Variablen automatisch entsorgt werden
     // lOutlook := unassigned;
end;

GuenterS 25. Apr 2008 15:20

Re: Outlook - Ansteuerung
 
Ich kann mir irgendwie nicht vorstellen, dass beim Erstellen bzw. holen des Ole Objectes für lOutlook der Fehler auftritt, weil sonst denk ich würde ja auch nicht die entsprechende Aufgabe in Outlook angelegt.

Deshalb habe ich um das Save und Logoff auch noch try ... except gemacht
Delphi-Quellcode:
procedure CreateOutlookTaskItem(aStart, aDueDate, aReminderTime: TDateTime;
   aSubject, aBody: string; aReminder: boolean);
var
   lNamespace, lOutlook, lFolder, lItem: OleVariant;
begin
  try
    loutlook := getactiveoleobject('outlook.application');
  except
    try
      loutlook := createoleObject('outlook.application');
    except
      on E:Exception do
      begin
        E.Message := 'Outlook Task kann nicht angelegt werden'#13#10+ E.Message;
        raise;
      end;
    end;
  end;
  lNamespace := lOutlook.getnamespace('MAPI');
  lNamespace.Logon(EmptyParam, EmptyParam, False, True);
  lFolder := lNamespace.getdefaultfolder(13);

  lItem := lOutlook.createitem(3);
  lItem.StartDate := aStart;
  lItem.Subject := aSubject;
  lItem.Body := aBody;
  if (aDueDate <> 0) then
    lItem.DueDate := aDueDate;
  lItem.Categories := 'test';

  if (aReminder) then
  begin
    lItem.ReminderTime := DateTimeToStr(aReminderTime);
    lItem.ReminderSet := true;
  end
  else
     lItem.ReminderSet := false;

  try
     lItem.Save;
  except
      on E:Exception do
      begin
        E.Message := 'Outlook Task kann nicht angelegt werden'#13#10+ E.Message;
        raise;
      end;
  end;

  try
      lNamespace.Logoff;
  except
      on E:Exception do
      begin
        E.Message := 'Outlook Task kann nicht angelegt werden'#13#10+ E.Message;
        raise;
      end;
  end;
end;
Es kommt aber zu keiner Exception, die mir weiterhelfen könnte.

shmia 25. Apr 2008 16:35

Re: Outlook - Ansteuerung
 
Zitat:

Zitat von GuenterS
Ich kann mir irgendwie nicht vorstellen, dass beim Erstellen bzw. holen des Ole Objectes für lOutlook der Fehler auftritt, weil sonst denk ich würde ja auch nicht die entsprechende Aufgabe in Outlook angelegt.

Das war auch nur dazu gedacht, um den Fall dass Outlook nicht installiert ist oder sonst ein Problem hat, sauber zu behandeln.
Das hat nicht direkt mit deinem Problem zu tun.
Ich wollte dir nur zeigen, dass das Verbergen von Exceptions (Error hiding) schlechter Programmierstil ist.
Zitat:

Zitat von GuenterS
Deshalb habe ich um das Save und Logoff auch noch try ... except gemacht

Das ist auf jeden Fall eine gute Idee.
Man sollte nur den Fehlertext leicht ändern, damit man im Fall einer Exception die Position im Sourcecode genau lokalisieren kann.
Zitat:

Zitat von GuenterS
Es kommt aber zu keiner Exception, die mir weiterhelfen könnte.

Verstehe ich das richtig ?
Es gibt keine Exception in dieser Procedure aber trotzdem siehst du eine Fehlermeldung ("... die Fehlerberichtmeldung kommt trotzdem.") ?
Dann muss das Problem doch eher ausserhalb von procedure CreateOutlookTaskItem zu suchen sein.

GuenterS 25. Apr 2008 17:27

Re: Outlook - Ansteuerung
 
Außerhalb passiert mit Outlook aber rein gar nichts.

Werde es mal extrahieren in eine eigene Minianwendung. Wenns dann auch noch kommt, vielleicht gibts ja auch Ursachen an meiner Outlook Installation. Es scheint immer dann zu sein wenn sich Outlook beendet.


:wall: Ich wollte dir nur zeigen, dass das Verbergen von Exceptions (Error hiding) schlechter Programmierstil ist. :wall:

Das ist nichts unbekanntes für mich ... und natürlich muss man die Fehlertexte noch ändern. Es geht mir hier ja auch nicht um die Entwicklung einer Procedure die ich 1:1 in die bestehende Applikation einbauen kann. Bischen Anpassen schaff ich gerade noch *grins*

renekr 6. Mai 2008 07:09

Re: Outlook - Ansteuerung
 
Hi @,
Ich bin gerade auch dabei meine bisherige Outlook Ansteuerung von XP O2003 auf Vista 2007 kompatible zu machen.
Weil ich nur die Mapi32.dll verwende und nun über die Ext. Mapi gehen will.

Allerdings wollte ich auch zuerst prüfen ob Outlook auf ist und wenn nciht neu starten.
Delphi-Quellcode:

  try
 -->>>>>  loutlook := GetActiveOleObject('Outlook.Application');
  except
    try
      loutlook := CreateOleObject('Outlook.Application');
    except
      exit;
    end;
Allerdings kracht es bei mir schon bei der ersten zeile,GetActiveOleObject.
Exception:
Klasse EOlesyserror mit meldung: "Vorgang nicht verfügbar ".

Hat ev. jemand eine Idee an was das leigen aknn?
Ich habe Vista mit Ot2007 installiert.

Nachtrag: Unter XP mit O2003 funktioniert es super.
danke

hoika 6. Mai 2008 07:33

Re: Outlook - Ansteuerung
 
Hallo,

guggst du hier, besonders die Security Option
1

und hier, besonders For ISVs
2

Wie es aussieht erlaubt Outlook 2007 unter Vista
externen Programmen keinen Zugriff mehr,
nur in-proc (also Dlls) sind erlaubt.

Du kannst das Prüfen,
indem du unter Vista mal den Virenscanner ausschaltest,
dann reagiert Outlook 2007 wie die 2003er Version.

In der 2. URL sind Tipps,
wie man das umgehen kann.


Heiko


Heiko

renekr 6. Mai 2008 07:52

Re: Outlook - Ansteuerung
 
Hi,
danke für die Schnelle Info.

Aber so weit bin ich ja ncoh nciht.
Ich will ja zuerst mal die Outlook Application aufmachen,ganz normal.

Und danach gehts erst an die Kommunikation.
Aber mit Ext. Mapi soltle es ja klappen,oder?


mfg

Luckie 6. Mai 2008 07:57

Re: Outlook - Ansteuerung
 
Entschuldigt meine Neugier, aber wie lautet denn der Fehlerbericht? :roll:

renekr 6. Mai 2008 08:04

Re: Outlook - Ansteuerung
 
Hi Luckie,
Kein thema,
bin froh um jeden Tip.

Wie oben geschrieben:
Allerdings kracht es bei mir schon bei der ersten zeile,GetActiveOleObject.
Exception:
Klasse EOlesyserror mit meldung: "Vorgang nicht verfügbar ".

Danke.

hoika 6. Mai 2008 08:19

Re: Outlook - Ansteuerung
 
Hallo,

du hast die Tipps schon gelesen oder ?
und den Virenscanner mal deaktiviert ?

Outlook 2007 erlaubt unter Vista aus Sicherheitsgründen
wohl einfach keinen externen Zugriff mehr.

So habe ich das zumindestens beim Überfliegen verstanden.

Ext.MAPI ist nicht das gleiche wie Extended MAPI,
weil das ohne Outlook-Objekte auskommt.


Heiko

renekr 6. Mai 2008 08:36

Re: Outlook - Ansteuerung
 
Hi Heiko,
Also ich habe einiges in der DP gefunden heut morgen und getestet unter Vista,Ot07 und Symantec Antivirus.

Mapi Wrapper.pas

Also mit dem Code habe ich unter meinen Bedingungen die Inbox Items ausgelesen ohne Fehler,oder Outlook Sicherheitsmeldung.
Einen Kalender Eintrag habe ich auch per Mapi schon gemacht.
Und da ging auch alles ohne Meldungen.


Delphi-Quellcode:
procedure TForm1.bGetMailsClick(Sender: TObject);
var
  InBox: TInbox;
  MailItem: TMapiMailItem;
begin
  InBox := TInBox.Create('Doe, John');
  try
    MailItem := InBox.GetFirst;
    while Assigned(MailItem) do begin
      mMails.Lines.Add(Format('From: %s <%s>'#13#10'Subject: %s'#13#10'%s'#13#10,
                      [MailItem.Sender,
                       MailItem.SenderEmail,
                       MailItem.Subject,
                       Copy(MailItem.Body, 1, Min(50, Pos(#13, MailItem.Body)))]));
      MailItem.Free;
      MailItem := InBox.GetNext;
    end;
  finally
    InBox.Free;
  end;
end;

hoika 6. Mai 2008 09:28

Re: Outlook - Ansteuerung
 
Hallo,

dann ist das kein Simple MAPI,
sondern schon das "richtige",
so wie es in den Links stand.

Hast du den Virenscanner mal testweise deaktiviert
und dann deinen anderen Code (.Application) ausprobiert ?


Heiko

renekr 6. Mai 2008 09:48

Re: Outlook - Ansteuerung
 
Hi,
ja klar.
So habe ich es als neue Version probiert .
Meine alte Methode mit der Mapi.dll ging ja unter 07 net mehr.

Also irgendwie komisch.
Wenn Outlook zu ist und Scanner deaktiviert .od aktiviert kommt die gleiche meldung,aber i bekomme den Dialog zum Auswahl des Profiles ( da 1 exchange und 1 Privat pop3 ) dann wähle ich eins aus und der dialog geht zu aber Outlook net auf.


Ich sollte halt wenn i es unter 07 zum laufen bringen will umstellen auf den Mapiwrap.pas also die Extended mapi version.
Wie beschrieben muss aber dazu Outlook auf sein.
Das auslesen der Inbox geht ich muss nur noch eine Art Code Referenz finden wo ich alles her bekomme.

Wie zb. die Foldernamen oder auch das ansprechen von Outlook zum öffnen einer neuen mai lund zur Parameter übergabe.

Vielen Dank.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 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