我正在使用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'对象。
无论如何,我正在关注你给我的文章,非常有用,谢谢。你还有其他任何建议吗?
感谢您的耐心等待。
答案 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
在此标识您的接收器。然后还有其他宏的设置和处理程序函数的快乐 - 我引用你的this和this文章作为例子和你可以查看的dispinterface ItemsEvents
oleview.exe
。
关于更新1:
如果要在AutoSync
中接收事件,请在那里实现接口 - 您不需要将事件接收到任何特定实例。但是,你最了解你的设计:)
我个人尽可能地保留中心插件类的逻辑。
注册代码将进入实现事件的类的某个方法,并在应该开始接收事件时调用,而typedef
将是例如OnItemChange()
。很好地放在班级的宣言中。
关于更新2:
从快速浏览一下,它看起来大部分都是正确的,但IDispatch
需要一个参数 - _ATL_FUNC_INFO AtlCallDispatch = {CC_STDCALL, VT_EMPTY, 1, {VT_DISPATCH}};
:
{{1}}