Autor Beitrag
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 07.09.13 09:19 
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:

ausblenden volle Höhe 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';
  //==============================================================================
  // Outlook erst einmal zurücksetzen
  //==============================================================================
  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.
Einloggen, um Attachments anzusehen!
_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19324
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: Tranx
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 07.09.13 10:25 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19324
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.09.13 11:16 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 07.09.13 11:38 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19324
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.09.13 12:08 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Wo frage ich ab, welcher Pfad benutzt wird?
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Schau doch mal im Process Monitor
Ok, ich poste auch noch einen Link, obwohl das eigentlich bei Google das erste Ergebnis ist... eigentlich in jedem Ergebnis der ersten Ergebnisseite... :roll:
technet.microsoft.co...ernals/bb896645.aspx

Für diesen Beitrag haben gedankt: Tranx
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Tranx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Sa 07.09.13 17:55 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
Entschuldige, ich habe den Prozessexplorer genommen. Da ist nichts zu finden.

Im Taskmanager Rechtsklick auf den Prozessnamen. Dann "Dateipfad öffnen".

Für diesen Beitrag haben gedankt: Tranx
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19324
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.09.13 19:06 
user profile iconTranx hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
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.