VSTO/Outlook et le Global Address List

Et un article barbare ! un ! Donc, comment récupérer les contacts de notre GAL (Global Address List) à partir d’un développement Outlook ?

Apparement ils ont oublié de faire le boulot (là j’parle de nos amis de chez Microsoft). On se limite seulement aux contacts favoris relatif au client Outlook. Pour accéder aux contacts enregistrés sur le serveur Exchange, il faut utiliser des API bien spécifiques. C’est la tâche à laquelle s’est attelé un MVP en écrivant une classe assez complète.

C’est ici que ça se passe: http://www.dimastr.com/redemption
Un petit exemple de code en C# (le VB.NET est largement commenté sur le site de Redemption) :
//On déclare notre application Outlook
Application outlook = Globals.ThisAddIn.Application;
//Puis un NameSpace de type MAPI
NameSpace ns = outlook.GetNamespace(« MAPI »);
//Ensuite une session Redemption
RDOSessionClass rdoSession = new RDOSessionClass();
//L’objet MAPI de notre session mappé avec celui de notre namespace
rdoSession.MAPIOBJECT = ns.MAPIOBJECT;
//Un objet Adress Book
RDOAddressBook rdoAdd = rdoSession.AddressBook;
//On parcoure les entrées du GAL
foreach (RDOAddressEntry rdoEnt in rdoAdd.GAL.AddressEntries)
{
//On récupère le nom de l’entrée
string sName = rdoEnt.Name.ToString();
//Puis le fax
const int PR_PRIMARY_FAX_NUMBER = 0x3A23001E;
string sFaxNumber = (string)rdoEnt.get_Fields(PR_PRIMARY_FAX_NUMBER);
}
Quelques remarques :
  • Petite subtilité concernant le fax. Seules certaines propriétés de l’entrée sont disponibles. Pour les autres -comme dans notre exemple, le fax- ils faut utiliser la fonction get_fields() en lui indiquant la constante héxadecimale correspondante, puis caster la valeur récupérée comme il faut.
  • Les données en question se trouvent ici : http://www.cdolive.com/cdo10.htm.
  • Utilisez le prefixe &H pour le VB.NET, et 0x pour le C#.
  • Pour savoir à quel champ correspond quelle donnée, utilisez l’utilitaire OutlookSpy : http://www.dimastr.com/outspy