Outlook加载项。如何管理项目事件

问题描述:

我正在为C++中的Outlook 2007做一个加载项。Outlook加载项。如何管理项目事件

我需要从Outlook项目(联系人,约会,任务和注释)中捕获创建,更改或删除事件,但我发现的唯一信息/示例是Visual Basic,因此我不知道连接事件处理程序。

下面是相关的一些信息:http://msdn.microsoft.com/en-us/library/bb208390(v=office.12).aspx

欢迎任何帮助:)谢谢

更新

对不起采取这一长期更新,我已经出城。我有一些怀疑/问题,你可能会知道如何提供帮助。

在我的情况下,我正在开始这个项目,所以我对这一切有点困惑。我有从IDTExtensibility2派生的类OutlookAddin。我还有另一个叫做AutoSync的类,当事件触发时我想要做所有的方法等等。此类的一个对象在OutlookAddin.cpp OnStartupComplete中初始化。

根据你的帖子MyClass应从IDispEventSimpleImpl<1 /*N*/, MyClass, &__uuidof(Outlook::ItemsEvents)>延伸,但其中哪一个? OutlookAddin或AutoSync?

我应该把这个代码放在哪里呢?

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; 

我读过您发布的链接,但仍然有这些疑惑...

更新2

这是比较复杂的,而不是理解我,虽然在第一个实例。

所以我有这样的:

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

然后在OutlookAddin.cpp,OnConnection方法:

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' 被定义一样

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()'_NameSpacePtr保留所有环境的地方。

此处的预期行为是在创建/编辑/删除ContactItem时触发OutlookAddin类中的函数“OnItemChange”,但这种情况没有发生......我将结构改为一切,位于主类OutlookAddin中。然后在函数'OnItemChange'上,我将开始我之前告诉过的'AutoSync'对象。

无论如何,我遵循你给我的文章,真的很有用,谢谢。你还有其他建议吗?

感谢您的耐心等待。

它已经有一段时间,但是你应该为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)); 

如果您MyClass类派生自:

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

而且MyItemEvents是:

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

N标识您的接收器 这里。然后是其余的宏的设置和处理函数的实现的喜悦 - 我参考thisthis文章的例子和dispinterface ItemsEvents,你可以在oleview.exe查找。


关于更新1:
如果你想收到AutoSync的事件,实现接口有 - 你不需要的事件下沉到任何具体的实例。然而,你知道你的设计最好:)
我只是尽可能多地保留中心插件类的逻辑。

注册码将进入实现事件的类的某种方法,然后在它应该开始接收事件时被调用,而typedef可能是例如。很好地放在班级的声明中。


关于更新2:

从看一眼看上去基本上是正确的,但OnItemChange()需要一个参数 - 一个IDispatch

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

谢谢你,我要带看看这个;) – framara 2010-05-06 14:25:18

+0

问题更新了,如果你可以看看。谢谢。 – framara 2010-05-11 13:09:44

+0

@framara,已更新。 – 2010-05-11 13:45:40