这样,通过在Outlook中通过上面提到的方法加载COM插件,就可以看到如图一所示的界面效果了,但是点击时没有响应,最后就让我们来解决这个问题。
工具条按钮CommandBarButton派发接口的响应事件是_CommandBarButtonEvents。ATL提供了二种模板类IDispEventImpl<>和IDispEventSimpleImpl<>来实现接口事件的接收,这里我们使用IDispEventSimpleImpl来实现(因为它不需要额外的类型库信息)。它需要设置SINK(接收)映射,通过_ATL_SINK_INFO结构来回调参数信息,最终通过DispEventAdvise和DispEventUnadvise来与源接口连接或断开。实现方法如下:
1. 在COutlookAddin继承类中加入IDispEventSimpleImpl继承,代码如下: class ATL_NO_VTABLE COutlookAddin :
public CComObjectRootEx<CComSingleThreadModel>,
……
public IDispEventSimpleImpl<1,COutlookAddin,&__uuidof(Office::_CommandBarButtonEvents)>
5. 最后,打开或断开与接口的连接。方法如下
● 在OnConnection接口函数的最后部分,加入下面代码来打开连接:CommandButton1Events::DispEventAdvise((IDispatch*)m_spButton);
● 在OnDisconnection接口函数中,加入下面代码来断开连接:CommandButton1Events::DispEventUnadvise((IDispatch*)m_spButton);
到此就完成一个Office内部插件的最小需求了,大家可以编译后打开Outlook2000看看效果如何,详细代码可参看文章所带示例源码,内有详细注释。
参考文献:
Building an Office2K COM addin with VC++/ATL -- Amit Dey
ATL开发指南(第二版) – Tom Armstrong & Ron Patton
打开VC6.0,在新建工程中选中ATL COM Appwizard,在右侧工程名中输入OutlAddin,点击下一步,接受默认选项Dynamic Link Library(DLL)不变,可以选中下面的Allow merging of proxy-stub code(允许合并代理/占位)复选框选项,点击Finish(完成)按钮完成工程创建。
// 新增Outlook2k内部插件注册键值
HKCU
{
Software
{
Microsoft
{
Office
{
Outlook
{
Addins
{
''OutlAddin.OutlookAddin''
{
val FriendlyName = s ''Outlook2000插件''
val Description = s ''使用ATL开发的Outlook2000的插件''
val LoadBehavior = d ''00000003''
val CommandLineSafe = d ''00000000''
}
}
}
}
}
}
}