Détecter si dossier public (d'échange) existe dans Outlook
-
22-10-2019 - |
Question
Avec le bloc de code suivant vous sélectionnez le dossier public qui est défini dans Outlook:
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;
Une erreur se produit sur la ligne marquée s'il n'y a pas de dossier public dans Outlook (pas de jeu de dossiers publics dans Outlook, pas Exchange Server).
La question est de savoir comment éviter cette erreur en détectant précédemment s'il existe un ensemble de dossiers publics ou non.
Attraper l'erreur avec essayer ... enfin / except n'a pas fonctionné comme l'exception est due à l'extérieur par l'API Microsoft (EOleException).
Je ne peux pas penser à une autre façon de détecter si le dossier existe comme la ligne origine de l'erreur est essentielle dans le choix du dossier public et donc obtenir des propriétés de celui-ci.
salutations
La solution
Pourquoi ne pas essayer / sauf le travail? Delphi attire des exceptions EOleSysError très bien. Et l'exception est soulevée par la méthode Delphi RTL, pas Outlook - toutes les bibliothèques IDispatch-friendly renvoient un code d'erreur, que les RTL convertis à une exception OLE après avoir demandé la description à l'aide IErrorInfo
.Autres conseils
Comme le message indique, Outlook ne connaît pas le profil à utiliser. Vous devez connexion à l'espace de noms MAPI avant de pouvoir faire quoi que ce soit avec elle. Vous devez le faire même s'il n'y a aucune information d'ouverture de session par exemple lorsque vous vous connectez à une instance locale d'Outlook qui n'est pas connecté à un serveur Exchange.
FNameSpace := FOutlook.GetNamespace('MAPI');
FNameSpace.Logon('', '', False, False);
Folder := FNameSpace.GetDefaultFolder( olFolderCalendar );
Memo1.Lines.Add( 'Calendar: ' + Folder.Name + ': ' + Folder.Description );
Ce codeblock fonctionne très bien. Je me suis dit que j'avais une autre question que je résolus. Merci pour votre temps.
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 Streblechenko était tout à fait raison avec sa réponse, je viens de le EOleException confondu du Débogueur pour un externe. L'exécution du code sans Debugger ne conduit pas à l'exception car il se fait attrapée par le bloc try / exception.
Marjan Venemas réponse peut être pratique lorsque vous travaillez avec plusieurs comptes dans Outlook.