其他参考资料

http://www.vckbase.com/document/viewdoc/?id=1749

用VC6.0编写Word插件(Office2007篇)

http://www.vckbase.com/document/viewdoc/?id=1737

用VC6.0编写Word插件(Office2K、XP、03)

------------------------------------------------------------------------------------

以上为本人转载

下面是作者ZDNet China 的文章

实现Office的COM插件
作者: ZDNet China 
2003-08-11 01:43 PM

当软件开发者考虑扩展Microsoft Office时,最常想到方法就是是使用VB了。实际上,用C++和ATL扩展Office是相当容易的。

我将向你演示如何建立项目以及如何把Office插件作为COM对象注册到Office中去。(本文用Outlook来作为插件的主程序。)

项目的建立

让我们建立一个新的ATL项目。首先,添加一个叫着Plugin的简单COM对象。用类向导把_IDTExtensibility2接口添加到Plugin类中。(别忘了选中IsupportErrorInfo复选框。)

类向导会把下述方法添加到Plugin类中:OnConnection、OnDisconnection、OnAddinsUpdate、 OnStartupComplete、OnBeginShutdown。本文只处理OnConnection和OnDisconnection方法。

然后,在Plugin头文件中创建一个类型定义(typedef,它只是用来简化代码的),如下所示:

#define APPID 102
class CPlugin;
typedef IDispEventImpl<APPID, CPlugin, &DIID_ApplicationEvents,
&LIBID_Outlook,9,0> OutLookSink;

我们现在需要在Plugin类的继承列表中添加OutLookSink类:

class ATL_NO_VTABLE CPlugin :
       public IPlugin,
       public IDispatchImpl<_IDTExtensibility2, &__uuidof(_IDTExtensibility2),
               &LIBID_AddInDesignerObjects, /* wMajor = */ 1, /* wMinor = */ 0>,
    public OutLookSink

在Plugin.h文件中为Mso9.dll和Msoutl9.olb引入声明,如下所示:

#import "C:\Program Files\Common Files\Designer\msaddndr.dll" \
raw_interfaces_only, \
raw_native_types, no_namespace, named_guids, auto_search

#import "C:\Program Files\Microsoft Office\Office\mso9.dll" \
rename_namespace("Office") named_guids

#import "C:\Program Files\Microsoft \
 Office\Office\msoutl9.olb" \
rename_namespace("Outlook"), raw_interfaces_only, \
 named_guids

using namespace Office;
using namespace Outlook;

注意,你需要按照你的系统中的文件路径来修正上面那些被引入文件的路径。

你必须把Office扩展作为COM组件注册到Office中去。Visual C++自动产生.rgs文件来控制COM注册。我们将需要添加额外的项目加到.rgs文件来支持Office的自动注册。

在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office键下,有若干个子键,每一个子键对应于系统中安装的每一个Office应用程序。在这些键中有插件关键字(add-in key)。

为了在Office中注册我们的COM对象,我们需要在插件键中添加新键。在HKEY_CURRENT_USER下同样有对应的树来控制单个用户的插件,而HKEY_LOCAL_MACHINE控制整个机器的插件。

下面是.rgs文件中Outlook的插件注册码:

HKCU
{
    NoRemove Software
    {
        NoRemove Microsoft
        {
            NoRemove Office
            {
                NoRemove Outlook
                {
                    NoRemove Addins
                    {
                        ForceRemove OutlookDemo.Plugin.1
                        {
                            val FriendlyName = s 'Outlook Plugin'
                            val Description = s 'An Outlook plugin'
                            val LoadBehavior = d 3
                            val CommandLineSafe = d 0
                        }
                        
                    }
                }
            }
        }
    }
}

这套注册项是为特定用户注册插件的,为了把插件设置为整个系统范围之内可用,只需把HKCU改为HKLM。

LoadBehavior的值控制了主程序运行后插件的行为。为了让主程序开始运行后插件自动运行,把LoadBehavior的值设置为3。如果想让用户手工载入插件,就把LoadBehavior设置为8。

如果你编译了这个项目,你就有了一个Outlook 插件;这个插件实际上没有做任何事,但是它的确是一个可以工作的插件。

我们现在向这个插件添加一些功能。首先,添加一个新的成员变量:

_ApplicationPtr m_pApp;

然后设置OnConnection方法:

STDMETHOD(OnConnection)(LPDISPATCH Application,
                                                            ext_ConnectMode ConnectMode,
                                                            LPDISPATCH AddInInst,
                                                            SAFEARRAY * * custom)
    {
             HRESULT rslt = S_OK;
             try{
                  m_pApp = Application;
                  OutLookSynch::DispEventAdvise(m_pApp);
             }catch(_com_error &e){
                  OutputDebugString(e.ErrorMessage());
                                    rslt = E_UNEXPECTED;                
             }
             return rslt;
    }

再设置与之对应的OnDisconnection方法,如下所示:

STDMETHOD(OnDisconnection)(ext_DisconnectMode RemoveMode,SAFEARRAY
* * custom)
      {
                 HRESULT rslt = S_OK;
                 try{
                       OutLookSynch::DispEventUnadvise(m_pApp);
                 }catch(_com_error &e){
                       OutputDebugString(e.ErrorMessage());
                       rslt = E_UNEXPECTED;
                 }
                 return rslt;
    }

现在我们可以收到好几种事件,例如,OnNewMail事件。得到事件的信息以及它们的ID的最好方法就是打开MSVC工具菜单上的OLE/COM观察器(viewer)。

  1. 进入File菜单并选择View Typelib。
  2. 浏览Msoutl9.olb文件。
  3. Scroll down ApplicationEvents的dispinterface。注意OnNewMail事件的ID号为0x0000f003.。
  4. 向Cplugin类添加一个叫着OnNewMail的方法。
  5. 建立一个Sink映射来把OnNewMail方法关联到OnNewMail事件。

BEGIN_SINK_MAP(CPlugin)
              SINK_ENTRY_EX(APPID, Outlook::DIID_ApplicationEvents, /
0x0000f003, OnNewMail)
    END_SINK_MAP()

现在我们只需要完成OnNewMail事件处理函数了。

void _stdcall OnNewMail(){
           MessageBox(NULL, "New Mail", NULL, MB_OK);
    }

如果你想消除这些讨厌的弹出式对话框(由该项目所创建),那么最简单方法就是遵循下面的步骤:

  1. 进入Outlook的Tools | Options菜单项。
  2. 选择Other标签。
  3. 点击Advanced Options按钮。
  4. 点击COM 的插件按钮。
  5. 选中Outlook的Plugin项并点击Remove。

如你所见,Office的COM插件实现起来相对来说并不麻烦甚至可以说很轻松。创建一个COM Office插件最困难的计算出所有参数的初值。不过一旦你发现可以在OLE/COM查看器中得到这些信息,这也就不成问题了。

实现Office的COM插件相关推荐

  1. office办公软件插件推荐word插件excel插件ppt插件

    描述:office办公软件插件推荐word插件excel插件ppt插件 信息: word插件:word必备工具箱 excel插件:excel必备工具箱 ppt插件:islide

  2. office tab enterprise是什么:Office Tab Enterprise是超级微软office多标签插件---高效办公必备神器

    office tab enterprise是什么:Office Tab Enterprise 是专为Office办公软件量身定做的一款office多标签插件工具,基于标准的 Microsoft Off ...

  3. 金格控件java版本_金格全文批注中间件安装软件-金格正文office控件(插件集成)下载V4.3.0.36安装版-西西软件下载...

    金格正文office控件(插件集成)是一款中国电信综合办公系统专用金格全文批注中间件插件集成,提供在线新建.编辑office文件和在office文件中进行签名印章.正文套红等功能,安装此控件前请确认您 ...

  4. 不坑盒子 + 智能写作(Office、WPS插件)助你高效办公,早点下班回家。

    不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理,如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件,这是一个非常好用的插件工具,专门应用在Word文档中,支持Office ...

  5. 不坑盒子 (Office、WPS插件)高效办公,让你提前进入摸鱼状态。

    不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理,如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件,是一个非常好用的办公工具,拥有近百项功能的Word,wps插件,支持O ...

  6. [工具]OFFICE插件管理工具-帮助更好地管理及使用电脑安装过的OFFICE插件

    在OFFICE软件的世界中,除了由微软提供的OFFICE软件功能外,还有大量的功能由第三方开发者完成,市面上也存在大量的OFFICE插件供用户选择. 使用场景 有些插件仅在某个特定场景下才会使用,日常 ...

  7. 拥抱开源, Office 365开发迎来新时代

    这个话题我曾经写过文章,也在一些场合做过专题分享.今天换一种方式,你可以直接点击下面这个小程序,用十分钟左右的时间,听我再讲一讲吧. 你需要在微信里面才能看到下面的小程序链接,并且可以直接点击 你可以 ...

  8. Esri Maps For Office制作漂亮的地图

    ArcGISOnline是一个基于云架构的资源中心,在这里你可以发布自己的地图资源.浏览其它ArcGIS爱好者发布的应用程序:总之,它为我们提供了一个在线交流的场所. EsriMapsForOffic ...

  9. Mathtype 免安装 | office自带UnicodeMath和LaTeX编辑功能

    众所周知,Word自带的编辑器需要键盘鼠标的完美配合,然而效率极其低下.取而代之的,LaTeX的公式编辑功能让你只用键盘就能写出复杂的公式,所以,Mathtype抓住了这个用户痛点,通过在office ...

最新文章

  1. centos卸载harbor_【Harbor】Harbor镜像仓库的安装与历史版本镜像的清理
  2. c#_Task用法总结
  3. LinkedHashMap源码分析
  4. MIT:这双AI袜子,暴露了你的行动丨Nature子刊
  5. [poj] 2318 TOYS || 判断点在多边形内
  6. 激光点云格式转换 bin 相互 pcd转换
  7. JVM-07垃圾收集Garbage Collection【GC日志分析】
  8. 产品经理必备神器推荐
  9. idea中没有j2ee_idea神器功能大全
  10. 幕客better-scroll
  11. Hive日期格式转换
  12. 实现类似于百度的自动补全搜索
  13. dubbo源码系列之filter的前生
  14. NI MultiSim 正版软件的下载链接
  15. B站 郝斌C语言 课件+笔记 (全)
  16. Scratch编程(八)扩展模块:文字朗读模块
  17. java烟花代码详细步骤,一文说清!
  18. DirectAdmin安装Zend Optimizer
  19. R_leaflet包_最易上手地图教程(一)(上)
  20. pandas操作excel 笔记

热门文章

  1. 电子线路(线性部分)——第二章 晶体三极管
  2. 蓝桥杯——单片机设计与开发初学者必备资料
  3. 【Python_pygame】制作一个游戏
  4. 吉林大学计算机孙磊,室内灯光控制系统设计毕业论文.doc
  5. docker quick start
  6. 阿里巴巴获得商品详情 API 返回值说明
  7. 批处理--删除当前目录及子目录中的空文件夹或文件
  8. 介绍python中几种遍历列表的for循环方法
  9. 【08月01日】A股滚动市净率PB历史新低排名
  10. android控制中心实现,基于Android平台的智能家居系统控制中心的设计与实现