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

时间:2010-05-06 11:16:54

标签: c++ event-handling outlook-2007 outlook-addin

我正在使用C ++为Outlook 2007做一个加载项。

我需要从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

这比我在第一时间理解起来要复杂得多。

所以我喜欢这个:

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'的定义如下:

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

然后在OutlookAddin.cpp中,OnConnection方法:

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

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

成为'OutlookWorker :: GetInstance() - &gt; GetNameSpacePtr()'保存所有环境的_NameSpacePtr。

这里的预期行为是在创建/编辑/删除ContactItem时从OutlookAddin类触发函数'OnItemChange'但是没有发生......我改变了一点结构,所有内容都在主类OutlookAddin中。然后在函数'OnItemChange'上,我将启动之前告诉过你的'AutoSync'对象。

无论如何,我正在关注你给我的文章,非常有用,谢谢。你还有其他任何建议吗?

感谢您的耐心等待。

1 个答案:

答案 0 :(得分:1)

已经有一段时间了,但您应该通过建议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将是例如OnItemChange()。很好地放在班级的宣言中。


关于更新2:

从快速浏览一下,它看起来大部分都是正确的,但IDispatch需要一个参数 - _ATL_FUNC_INFO AtlCallDispatch = {CC_STDCALL, VT_EMPTY, 1, {VT_DISPATCH}};

{{1}}