Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Seite 1 von 2  1 2      

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