Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Zugriff auf Outlook erzeugt Fehler
Tranx - Sa 07.09.13 09:19
Titel: Zugriff auf Outlook erzeugt Fehler
Hallo,
in meinen Programmen nutze für das Versenden von E-Mail den Zugriff auf Outlook. An der Arbeit funktioniert das auch problemlos, nur zuhause habe ich einen merkwürdigen Effekt. Die Routine zum Testen, ob Outlook überhaupt installiert ist, ist anbei:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71:
| function InitOutlook: Boolean; const liVersion: integer = 0; var lsVersion: string; begin gsAktProc := 'Outlook.InitOutlook'; oleNameSpace := null; OutlookExist := False; try CoInitialize(nil); oleOutlook := NULL; if liVersion = 0 then begin liVersion := 9; while not (OutlookExist) do begin Inc(liVersion); try lsVersion := 'Outlook.Application.' + Trim(IntToStr(liVersion)); oleOutlook := CreateOLEObject(lsVersion); oleNameSpace := oleOutlook.GetNameSpace('MAPI'); OutlookExist := TRUE; except oleOutlook := NULL; OutlookExist := FALSE; end; end; end else begin try lsVersion := 'Outlook.Application.' + Trim(IntToStr(liVersion)); oleOutlook := CreateOLEObject(lsVersion); oleNameSpace := oleOutlook.GetNameSpace('MAPI'); OutlookExist := TRUE; except oleOutlook := NULL; OutlookExist := FALSE; Result := FALSE; end; end; if OutlookExist then begin try oleTaskFolder := oleNameSpace.GetDefaultFolder(olFolderTasks); <== hier tritt der Fehler auf oleCalendarFolder := oleNameSpace.GetDefaultFolder(olFolderCalendar); oleContactFolder := oleNameSpace.GetDefaultFolder(olFolderContacts); oleJournalFolder := oleNameSpace.GetDefaultFolder(olFolderJournal); oleNotesFolder := oleNameSpace.GetDefaultFolder(olFolderNotes); oleSendMailFolder := oleNameSpace.GetDefaultFolder(olFolderSentMail); oleOutboxFolder := oleNameSpace.GetDefaultFolder(olFolderOutbox); oleInBoxFolder := oleNameSpace.GetDefaultFolder(olFolderInbox); Result := TRUE; except Result := FALSE; end; end else begin Result := FALSE; end; except Fehler(EMailFehler, 1); FehlerZeile(FALSE); Result := FALSE; end; end; |
Da ich mehrere Outlookversionen im Netz habe (Outlook 2003 und Outlook 2010) habe ich einfach den Outlooktest über mehrere Versionen gemacht. Ist ja bloß die entsprechende Nummmer am Anhang von Outlook.Application.xx. Soweit - so gut. Aber zuhause bekomme ich, wenn ich Outlook NICHT gestartet habe (Windows 7 als Betriebssystem) folgenden Fehler (Bild im Anhang), ist jedoch Outlook gestartet, dann bekomme ich den Fehler nicht! Komisch, nicht.? Der Fehler tritt (nach Test mit dem Debugger an der markierten Stelle auf).
Vielleicht weiß ja jemand, warum das so ist. Ich habe ja schon ein Try .. Except .. End eingefügt, aber den Fehler kann ich - wahrscheinlich weil er extern bei Outlook und nicht bei Delphi auftritt - nicht abfangen. Ich weiß ja, wie ich es verhindern kann, einfach Outlook vorher starten. Aber auf der Arbeit funktioniert das auch ohne Fehler wenn Outlook nicht gestartet ist. Dort allerdings bei Windows XP.
jaenicke - Sa 07.09.13 10:14
Das sieht wie ein Pfadproblem aus. Schau doch mal im Process Monitor wo Outlook diese Datei liest, wenn du es separat startest und wo, wenn du es mit deinem Programm ansprichst.
Tranx - Sa 07.09.13 10:25
jaenicke hat folgendes geschrieben : |
Das sieht wie ein Pfadproblem aus. Schau doch mal im Process Monitor wo Outlook diese Datei liest, wenn du es separat startest und wo, wenn du es mit deinem Programm ansprichst. |
Das kann schon sein. Denn Windows 7 führt ja das Roaming durch. Und ich habe schon festgestellt, dass die Datei Extend.Dat an mehreren Stellen (die gleichen?) unter Anwendungsdaten... auftauchte. Ich habe diese Dateien nach Anleitung im Internet auf die Frage nach dem Extend.dat-Problem gelöscht. Outlook erzeugt sie beim Start dann neu. Aber es hilft nichts. Das Problem besteht weiter, wenn ich bei meinem Windows 7-Rechner das Delphi-Programm ohne Outlook starte. Und wie kann ich denn dieses Pfadproblem lösen, an welcher Stelle? Auch will ich ja keinen festen Pfad festlegen, denn ich weiß ja nicht, ob dann das Programm unter Windows XP nicht mehr läuft, weil dann dort der Pfad falsch ist. Auf der Arbeit habe ich alle möglichen Kombinationen (Outlook XP, Outlook 2003, Outlook 2010, Windws XP, Windows 7 32 und 64-bit, Windows 2000). Bisher funktionieren alle Kombinationen ohne Probleme. Daher möchte ich da so wenig wie möglich eingreifen, verstehst Du?
Bisherige Lösung, die ich wohl beibehalte: dass ich erst Outlook aufrufe und dann das Delphi-Programm starte. Wieso ist dann das Problem plötzlich gelöst? Fragen über Fragen.
Ergänzung:
Ist Outlook nicht gestartet, dann existiert kein Outlook-Prozess. Wenn ich dann das Delphi-Programm starte und es wird Initoutlook aufgerufen, sind unter svchost plötzlich zwei Outlookprozesse. Die scheinen sich gegenseitig zu behindern. Das wird das Problem sein. Wenn Outlook vorher gestartet wurde, liegt es als eigenständiger Prozess vor und bei Initoutlook wird dann kein zusätzlicher Prozess in svchost gestartet. Und wenn Outlook nach dem Programm gestartet wird, greift Outlook dann auf den svchost-Outlook-Prozess zu und es liegt dann nur noch ein Prozess vor. Das nur zur Info. P.S. die zwei Prozesse können natürlich auch das Fehlerfenster und de Prozess selber sein.
jaenicke - Sa 07.09.13 11:16
Tranx hat folgendes geschrieben : |
Und wie kann ich denn dieses Pfadproblem lösen, an welcher Stelle? |
Solange du nicht geschaut hast wo die denn nun versucht wird zu lesen, kann ich auch nichts dazu sagen. Denn nur das könnte Hinweise dazu bringen
warum an dieser offenbar falschen Stelle gelesen wird. Oder wenn es die richtige ist, ob es dabei Zugriffsfehler gibt (bereits verwendet? ...).
Tranx - Sa 07.09.13 11:38
jaenicke hat folgendes geschrieben : |
Tranx hat folgendes geschrieben : | Und wie kann ich denn dieses Pfadproblem lösen, an welcher Stelle? | Solange du nicht geschaut hast wo die denn nun versucht wird zu lesen, kann ich auch nichts dazu sagen. Denn nur das könnte Hinweise dazu bringen warum an dieser offenbar falschen Stelle gelesen wird. Oder wenn es die richtige ist, ob es dabei Zugriffsfehler gibt (bereits verwendet? ...). |
Wo frage ich ab, welcher Pfad benutzt wird? Ich sehe da keine Informationen, was der Prozess abfragt. Es erscheint ein kurzzeitig rot hinterlegter Prozess wenn das Delphi-Programm ohne Outlook auf Outlook zugreift. Für die genauere Recherche fehlen mir leider die Infs, wo ich z.B. Pfade und abgerufene Dateien erfahre. Aber egal - ich kenne ja die Lösung, so werde ich eben bis auf weiteres so vorgehen, auch wenn ich die Fehlerursache nicht kenne. Und selbst wenn ich es wüsste, was nützt es, da ich keine Möglichkeit sehe, Pfade im Voraus festzulegen.
Tranx - Sa 07.09.13 12:58
Entschuldige, ich habe den Prozessexplorer genommen. Da ist nichts zu finden. Ok, werde mal suchen, was er da anzeigt. Doch ernstlich, die Frage ist ja dann - falls es der falsche Pfad ist - wie ich das löse, ohne dass nachher der Fehler nicht bei Windows XP auftritt. Wie gesagt, wenn Outlook die Kontrolle über die Abfrage übernimmt (gestartetes Outlook) ist alles ok. Das reicht mir eigentlich schon, da ich dann keine weiteren Änderungen vornehmen muss, die anderweitig Problem verursachen könnten. Davon habe ich an der Arbeit bei einem derartigen Mix von Betriebssystemen und Officeversionen schon genug.
Tranx - Sa 07.09.13 17:23
Ich habe mal spaßeshalber den Prozessmonitor laufen lassen. Also so viele Einträge von "Name not found", dass es schon schwierig ist, den richtigen zu finden, zumal ein Filter ewig dauert. Man wundert sich nur, dass Windows überhaupt noch funktioniert.
Also, ich lasse es erstmal dabei, erst Outlook starten, und dann das Delphiprogramm.
Wenigstens danke für die Tipps.
Gerd Kayser - Sa 07.09.13 17:55
Tranx hat folgendes geschrieben : |
Entschuldige, ich habe den Prozessexplorer genommen. Da ist nichts zu finden. |
Im Taskmanager Rechtsklick auf den Prozessnamen. Dann "Dateipfad öffnen".
jaenicke - Sa 07.09.13 19:06
Tranx hat folgendes geschrieben : |
Ich habe mal spaßeshalber den Prozessmonitor laufen lassen. Also so viele Einträge von "Name not found", dass es schon schwierig ist, den richtigen zu finden, zumal ein Filter ewig dauert. |
Hmm, bei mir hatte ich damit noch keine Probleme. :gruebel:
Ein Filter auf "Path" "contains" "Extend.dat" sollte reichen und performancemäßig hatte ich damit noch keine Probleme.
Gerd Kayser hat folgendes geschrieben : |
Im Taskmanager Rechtsklick auf den Prozessnamen. Dann "Dateipfad öffnen". |
Damit findet man heraus wo die entsprechende Anwendung liegt, aber das hat mit dem Thema (herausfinden wo das Programm die Datei versucht zu lesen) eigentlich nicht viel zu tun.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!