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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top