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
标识您的接收器 这里。然后是其余的宏的设置和处理函数的实现的喜悦 - 我参考this和this文章的例子和dispinterface ItemsEvents
,你可以在oleview.exe
查找。
关于更新1:
如果你想收到AutoSync
的事件,实现接口有 - 你不需要的事件下沉到任何具体的实例。然而,你知道你的设计最好:)
我只是尽可能多地保留中心插件类的逻辑。
注册码将进入实现事件的类的某种方法,然后在它应该开始接收事件时被调用,而typedef
可能是例如。很好地放在班级的声明中。
关于更新2:
从看一眼看上去基本上是正确的,但OnItemChange()
需要一个参数 - 一个IDispatch
:
_ATL_FUNC_INFO AtlCallDispatch = {CC_STDCALL, VT_EMPTY, 1, {VT_DISPATCH}};
谢谢你,我要带看看这个;) – framara 2010-05-06 14:25:18
问题更新了,如果你可以看看。谢谢。 – framara 2010-05-11 13:09:44
@framara,已更新。 – 2010-05-11 13:45:40