Erkennen Sie, ob der öffentliche Ordner (des Austauschs) in Outlook vorhanden ist
-
22-10-2019 - |
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
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.