2010-05-06 4 views
2

Je fais un complément pour Outlook 2007 en C++.Add-in Outlook. Comment gérer les événements d'événements

Je dois capturer les événements comme créer, modifier ou supprimer des éléments d'Outlook (contact, rendez-vous, tâches et notes) mais les seules information/exemples que j'ai trouvés sont pour Visual Basic donc je ne sais pas comment connecter le gestionnaire d'événements.

Voici quelques informations concernant: http://msdn.microsoft.com/en-us/library/bb208390(v=office.12).aspx

Toute aide est la bienvenue :) Merci

Mise à jour

Désolé pour prendre ce temps pour mettre à jour, je suis hors de la ville. J'ai quelques doutes/problèmes que vous pouvez savoir comment aider.

Dans mon cas, je prends ce projet qui a été lancé, donc je suis un peu confus à propos de tout cela. J'ai la classe OutlookAddin qui dérive de IDTExtensibility2. J'ai aussi cette autre classe, appelée AutoSync, où je voudrais faire toutes les méthodes quand l'événement se déclenche et ainsi. Un objet de cette classe est initialisé dans OutlookAddin.cpp OnStartupComplete.

Selon votre MyClass post devrait s'étend de IDispEventSimpleImpl<1 /*N*/, MyClass, &__uuidof(Outlook::ItemsEvents)> mais l'un d'entre eux? OutlookAddin ou AutoSync?

Où devrais-je aussi mettre ce code?

CComPtr<Outlook::MAPIFolder> folder; 
// get the folder you're interested in 
CComPtr<Outlook::_Items> items; 
hr = folder->get_Items(&items); 
hr = MyItemEvents::DispEventAdvise(items, &__uuidof(Outlook::ItemsEvents)); 

typedef IDispEventSimpleImpl<1 /*N*/, MyClass, 
      &__uuidof(Outlook::ItemsEvents)> MyItemEvents; 

J'ai lu les liens que vous posté mais toujours avoir ces doutes ...

Mise à jour 2

Ceci est plus compliqué à comprendre que je pensais dans un premier temps.

J'ai donc comme ceci:

OutlookAddin.h

class OutlookAddin : 
public IDTExtensibility2, 
public IDispEventSimpleImpl<1, OutlookAddin, &__uuidof(Outlook::ItemEvents)> 
... 
BEGIN_SINK_MAP(OutlookAddin) 
SINK_ENTRY_INFO(1, __uuidof(Outlook::ItemEvents), 0xf002, OutlookAddin::OnItemChange, &OnSimpleEventInfo) 
END_SINK_MAP() 
... 
void __stdcall OnItemChange(); 

'OnSimpleEventInfo' est défini comme:

extern _ATL_FUNC_INFO OnSimpleEventInfo; 
_ATL_FUNC_INFO OnSimpleEventInfo = {CC_STDCALL,VT_EMPTY,0}; 

puis à OutlookAddin.cpp, méthode OnConnection:

CComPtr<Outlook::MAPIFolder> folder; 
CComPtr<Outlook::_Items> items; 

OutlookWorker::GetInstance()->GetNameSpacePtr()->GetDefaultFolder(olFolderContacts, &folder); 
folder->get_Items(&items); 
DispEventAdvise(items, &__uuidof(Outlook::ItemsEvents)); 

b eing 'OutlookWorker :: GetInstance() -> GetNameSpacePtr()' le _NameSpacePtr où tout l'environnement est conservé.

Le comportement attendu ici est de déclencher la fonction 'OnItemChange' de la classe OutlookAddin lorsqu'un ContactItem est créé/édité/supprimé mais cela ne se produit pas ... J'ai changé un peu la structure pour tout ce qui est dans la classe principale OutlookAddin . Puis sur la fonction 'OnItemChange' je vais lancer l'objet 'AutoSync' que je vous ai déjà dit.

En tout cas, je suis les articles que vous m'avez donnés, vraiment utiles, merci. Avez-vous encore d'autres suggestions pour moi?

Merci de votre patience.

Répondre

1

Son été un certain temps, mais vous devriez obtenir ces événements point en conseillant pour Folder.Items:

CComPtr<Outlook::MAPIFolder> folder; 
// get the folder you're interested in 
CComPtr<Outlook::_Items> items; 
hr = folder->get_Items(&items); 
hr = MyItemEvents::DispEventAdvise(items, &__uuidof(Outlook::ItemsEvents)); 

Si votre classe MyClass dérive:

IDispEventSimpleImpl<1 /*N*/, MyClass, &__uuidof(Outlook::ItemsEvents)> 

Et MyItemEvents est:

typedef IDispEventSimpleImpl<1 /*N*/, MyClass, 
      &__uuidof(Outlook::ItemsEvents)> MyItemEvents; 

N identifie votre évier ici. Ensuite, il ya la joie des macros restantes à installer et les fonctions de gestionnaire à mettre en œuvre - je vous renvoie à this et this article pour des exemples et à la dispinterface ItemsEvents que vous pouvez rechercher dans oleview.exe.


En ce qui concerne la mise à jour 1:
Si vous souhaitez recevoir les événements AutoSync, implémenter l'interface là - vous n'êtes pas obligé de couler les événements à une instance spécifique. Cependant, vous connaissez mieux votre design :)
Je garderais personnellement autant de logique de la classe addin centrale que possible. Le code d'enregistrement entrerait alors dans une méthode de la classe implémentant les événements et serait appelé chaque fois qu'il devrait commencer à recevoir des événements, tandis que le code typedef serait par ex. bien placé dans la déclaration de la classe.


En ce qui concerne la mise à jour 2:

D'un rapide coup d'œil, il semble surtout à droite, mais OnItemChange() prend un paramètre - un IDispatch:

_ATL_FUNC_INFO AtlCallDispatch = {CC_STDCALL, VT_EMPTY, 1, {VT_DISPATCH}}; 
+0

Merci, je vais prendre un coup d'oeil à ceci;) – framara

+0

Question mise à jour, si vous pouviez jeter un coup d'oeil. Merci. – framara

+0

@framara, mise à jour. –

Questions connexes