Frage

Mit dem folgenden Code-Block wählen Sie den öffentlichen Ordner aus, der in Outlook festgelegt ist:

const
  olPublicContactsFolder = $00000012; //constant for the public folder
begin
Outlook := CreateOleObject('Outlook.Application');
// Get name space
NameSpace := Outlook.GetNameSpace('MAPI');
// Get root public folder
ContactsRoot := NameSpace.GetDefaultFolder(olPublicContactsFolder); //<-- Error
Contacts:= Contactsroot;

Ein Fehler in der markierten Zeile tritt ein Fehler auf, wenn kein öffentlicher Ordner in Outlook vorhanden ist (kein öffentlicher Ordner in Outlook, kein Exchange -Server).

Die Frage ist, wie Sie diesen Fehler vermeiden können, indem Sie zuvor festgestellt haben, ob ein öffentlicher Ordner festgelegt ist oder nicht.

Den Fehler mit fangen Ein Versuch ... endlich/außer Block hat nicht funktioniert Da die Ausnahme extern durch die Microsoft -API (eoleexception) verursacht wird.

Ich kann mir keine andere Möglichkeit vorstellen, zu erkennen, ob der Ordner vorhanden ist, da die Linie verursacht, die den Fehler für die Auswahl des öffentlichen Ordners und damit die Eigenschaften davon erhält.

Schöne Grüße

War es hilfreich?

Lösung

Warum sollte es nicht versuchen/außer arbeiten? Delphi fängt EoleSySror -Ausnahmen in Ordnung. Und die Ausnahme wird von der Delphi RTL und nicht von Outlook angehoben - alle idispatch -freundlichen Bibliotheken geben einen Fehlercode zurück, den der RTL nach Anforderung der Beschreibung mit iErorinfo in eine OLE -Ausnahme konvertiert.

Andere Tipps

Wie die Nachricht angibt, weiß Outlook nicht, welches Profil verwendet werden soll. Sie müssen sich im Mapi -Namespace anmelden, bevor Sie etwas damit anfangen können. Sie müssen dies auch dann tun, wenn beispielsweise keine Anmeldeinformationen vorhanden sind, wenn Sie eine Verbindung zu einer lokalen Outlook -Instanz herstellen, die nicht mit einem Exchange -Server verbunden ist.

FNameSpace := FOutlook.GetNamespace('MAPI');
FNameSpace.Logon('', '', False, False);
Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );

Dieser Codeblock funktioniert gut. Ich dachte, ich hätte ein weiteres Problem, das ich gelöst habe. Vielen Dank für Ihre Zeit.

function DoesPublicFolderExist():Boolean;
const
  olFolderContacts = $00000012;
var
  Outlook, Namespace, ContactsRoot, Contactsfolder : OleVariant;
begin
  // Connect to outlook
  Outlook := CreateOleObject('Outlook.Application');
  // Get name space
  NameSpace := Outlook.GetNameSpace('MAPI');
  // Get root contacts folder
  try
    ContactsRoot := NameSpace.GetDefaultFolder(olFolderContacts);
    Result:= True;
  except
    Result:= False;
  end;
end;

Dmitry Streblenko hatte mit seiner Antwort ganz Recht, ich habe nur die Eoleexception des Debuggers für eine externe. Das Ausführen des Code ohne den Debugger führt nicht zur Ausnahme, da er tatsächlich durch den Versuchs-/Ausnahmeblock erfasst wird.

Marjan -Venemas antworten möglicherweise nützlich, wenn sie mit mehreren Konten in Outlook arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top