下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 编写office插件.doc

编写office插件.doc.doc

编写office插件.doc

_微笑着失忆_却无法放弃_
2017-10-06 0人阅读 举报 0 0 暂无简介

简介:本文档为《编写office插件.docdoc》,可适用于综合领域

编写office插件docKeyword:addin,wordAbstract:word插件在VC中导入Office类从类型库中导入VS从菜单选择项目添加类在弹出的对话框中选择TypeLib中的MFC类。然后根据注册表或exedllolbtlbocx类型的文件添加类。选择好注册表选项或文件后会出现很多可以添加的类选择需要的添加到项目中。然后向导会添加新类文件从类型库向导中用“添加类”创建的计算机生成的IDispatch包装类#import"安装目录OFFICE()MSWORDOLB"nonamespaceclassXXX{}被cpp包含并编译后Debug或生成目录里会自动产生*tlh*tli两个文件。里面包括所有的类的导出。从动态库直接导入在stdafxh文件中写入#import"系统盘:ProgramFilesCommonFilesMicrosoftSharedOffice()msodll"renamenamespace("MSOffice")usingnamespaceMSOfficeDebug或生成目录里会自动产生msotlhmsotli两个文件里面包括所有的类的导出只是自己要费力区别一下。这些是关于office的。里面的类可以直接用。还有这些是可选的根据需要酌情添加。#import"系统盘:ProgramFilesCommonFilesMicrosoftSharedVBAVBAVBEEXTolb"renamenamespace("VBE")usingnamespaceVBE#import"安装目录OFFICE()MSWORDolb"rename("ExitWindows","ExitWindowsEx"),namedguids,renamenamespace("MSWord")usingnamespaceMSWord二者区别类型库中导入方法与第二中方法相比给我们产生了包装好的C类非常容易使用是常用的手段。在其头文件里有#importxx。importdll的方法是COM标准方法。共同点编译之后Debug或生成目录里会自动产生*tlh*tli文件里面包括所有的类的导出。Office及其组件的常量枚举在msotlhmsotli中可以查阅到。简介你也许曾在Office下的Word、Access、Excel、PowerPoint等软件中的工具条或菜单条资源中看到一些其它软件加入的新的自定义工具条按钮或菜单条当点击它们时会有其不同的响应发生。下面让我们也来实现这些功能需要说明的是在这里我们不用VBVBA来实现它而是用VC中所带ATL(活动模板库)来开发具有这种效果的Office内部COM插件。在Office中不管是Word、Access、Excel、PowerPoint还是Outlook等它们COM插件的编程方法及步骤都是极其相似的(除注册表中键值及导入相应类型库不同外)。基础知识一个Office下的内部COM插件必须实现一个IDTExtensibility派发接口IDTExtensibility派发接口被定义在MSADDinDesigner类型库(MSADDNDRdllMSADDNDRtlb)中通常位于<盘符>ProgramFilesCommonFilesDesigner下。IDTExtensibility接口中必须实现下面五个接口函数(一般只需编写OnConnection和OnDisconnection中代码)分别如下:OnConnection:装载插件到内存时处理(可以通过自动化在程序启动时自动装载插件)。OnDisconnection:从内存中缷载插件时处理。OnAddinsUpdate:COM插件改变时处理。OnStartupComplete:当应用程序启动时插件刚装载完成时处理。OnBeginShutdown:当应用程序关闭时插件刚缷载完成时处理。组件注册只有在正确注册了相应应用程序的内部COM插件时才能被其应用程序加载上。需要在注册表中创建以下键值:HKEYCURRENTUSERSoftwareMicrosoftOffice<TheOfficeApp>Addins<ProgID>其中TheOfficeApp表示相应程序名如:Word、Outlook等ProgID表示内部COM插件程序的唯一标识符的字符串表示形式如:OutlookAddinAddin等。ProgID键值下主要创建以下四个键值:FriendlyName:字符串类型插件的名称将在相应程序的COM加载对话框中看到。Description:字符串类型插件的描述信息。LoadBehavior:DWORD类型决定插件将以什么形式被装载。当其值为x时为应用程序装载时被自动装载(一般使用此值)、当其值为x时为用户控制激活装载。CommandLineSafe:DWORD类型命令行方式可以设置为x(真)或x(假)。编写Office插件的框架创建工程用VC创建一个ATLCOM类型的DLL工程名称WordAddinFrame。添加组件VC:菜单Insert>NewATLObject插入一个简单的Object名称为WordAddin。VS:添加类ATL简单对象。实现IDTExtensibility接口在ClassView中的CWordAddin类上点鼠标右键在弹出的右键菜单中选ImplementInterface项(实现接口)。在弹出的实现接口对话框中点击AddTypelib(添加类型库)在弹出的BrowseTypeLibraries对话框中向下滚动选取MicrosoftAddinDesigner()子项点OK按钮。在弹出的接口列表对话框中选中IDTExtensibility接口点OK按钮完成导入。系统会自动为你生成空的上面所提到的五个所需接口函数。修改工程下的WordAddinrgs文件在下面增加如下代码HKLM{Software{Microsoft{Office{Word{Addins{'WordAddinFrameWordAddin'{valFriendlyName=s'MyWORDAddin'valDescription=s'ItisaWordaddin'valLoadBehavior=d''valCommandLineSafe=d''}}}}}}}要注意的是:以上内容写如注册表第一个也可以是HKCU主键。Office下面的那个子项代表了这个插件是属于那个组件Word、Excel、Outlook等等。Addins下面的那个子项要写成你添加的COM组件的名字。所有的值两边加的都是单引号而且要用英文下的单引号不能用双引号。这样一个Office插件的框架才算完成。编写Word按钮插件引入文件在Stdafxh文件里为工程导入office文件。加入后要保证编译成功。引入这两个文件的原因主要是为了引入一些变量类型为后面的UI创建作准备。*三个文件顺序不能错否则编译出错前面两个是系统目录下第三个是安装目录Office下导入使用的例子*#import"E:ProgramFilesCommonFilesMicrosoftSharedOfficemsodll"renamenamespace("Office")usingnamespaceOffice#import"E:ProgramFilesCommonFilesMicrosoftSharedVBAVBAVBEEXTolb"renamenamespace("VBE")usingnamespaceVBE#import"D:ProgramFilesMicrosoftOfficeOfficeMSWORDolb"rename("ExitWindows","ExitWindowsEx"),namedguids,renamenamespace("MSWord")usingnamespaceMSWordOffice界面知识在Office应用程序中尽管菜单和工具栏按钮看上去不太一样,但实质上它们是相同类型的对象。CommandBars集合包含程序中的所有命令条如:工具条和菜单条。每一个CommandBars集合都有多个CommandBar对象和它对应。CommandBar对象可以包含其它的CommandBar对象这些对象是作为按钮或菜单命令来用的。每一个CommandBar都将通过CommandBarControls对象被引用。CommandBarControls又可以包含一组CommandBarControl对象。每一个CommandBarControl可以包含一个CommandBar对象并可以通过它来存取控件属性。每一个CommandBarControl对象实际是对应CommandBarControls中的控件集合。CommandBarControl可以有三种表现形式:*弹出式(CommandBarPopup):相当于菜单条的一个菜单项。*组合框(CommandBarComboBox):类似于工具条中组合框控件。它包括一个工具栏和紧接着工具栏的一个下拉箭头。单击该按钮将显示出更多的带图标的菜单命令。*按钮(CommandBarButton):相当于标准的工具栏按钮即带有图标的按钮。创建按钮等界面CWordAddin::OnConnection这个函数里面可以创建按钮和装载的最佳地点。代码比较多具体见例程。按钮响应函数知识工具条按钮CommandBarButton派发接口的响应事件是CommandBarButtonEvents。ATL提供了二种模板类IDispEventImpl<>和IDispEventSimpleImpl<>来实现接口事件的接收这里我们使用IDispEventSimpleImpl来实现(因为它不需要额外的类型库信息)。它需要设置SINK(接收)映射通过ATLSINKINFO结构来回调参数信息。给按钮添加响应函数为CWordAddin增加父类publicIDispEventSimpleImpl<,CWordAddin,uuidof(Office::CommandBarButtonEvents)>publicIDispEventSimpleImpl<,CWordAddin,uuidof(Office::CommandBarButtonEvents)>每一个代表一个菜单项或者按钮的事件有几个按钮就要有几个父类在cpp中ATLFUNCINFOOnClickButtonInfo={CCSTDCALL,VTEMPTY,,{VTDISPATCH,VTBYREF|VTBOOL}}在h中externATLFUNCINFOOnClickButtonInfo在h类里面加入BEGINSINKMAP(CWordAddin)ENDSINKMAP()这样消息映射等框架就写好了。添加相应函数的声明、定义、映射(注意映射添加在h的SINKMAP映射表之间)voidstdcallOnClickButton(IDispatch**Office::CommandBarButton**Ctrl,VARIANTBOOL*CancelDefault)voidstdcallOnClickButton(IDispatch**Office::CommandBarButton**Ctrl,VARIANTBOOL*CancelDefault)SINKENTRYINFO(,uuidof(Office::CommandBarButtonEvents),*dispid*x,OnClickButton,OnClickButtonInfo)SINKENTRYINFO(,uuidof(Office::CommandBarButtonEvents),*dispid*x,OnClickButton,OnClickButtonInfo)voidstdcallCWordAddin::OnClickButton(IDispatch**Office::CommandBarButton**Ctrl,VARIANTBOOL*CancelDefault){MessageBox(,"hello","world",MBOK)}voidstdcallCWordAddin::OnClickButton(IDispatch**Office::CommandBarButton**Ctrl,VARIANTBOOL*CancelDefault){::MessageBox(,"hello","world",MBOK)}连接与断开最终通过DispEventAdvise和DispEventUnadvise来与源接口连接或断开。把产生好的按钮保存为成员变量并在CWordAddin::OnDisconnection的时候释放。CWordAddinh中加入CComQIPtr<Office::CommandBarButton>mspCmdButtonCComQIPtr<Office::CommandBarButton>mspCmdButtontypedefIDispEventSimpleImpl<*nID=*,CWordAddin,uuidof(Office::CommandBarButtonEvents)>CommandButtonEventstypedefIDispEventSimpleImpl<*nID=*,CWordAddin,uuidof(Office::CommandBarButtonEvents)>CommandButtonEvents创建的时候OnConnection加入代码mspCmdButton=spCmdButtonmspCmdButton=spCmdButtonCommandButtonEvents::DispEventAdvise((IDispatch*)mspCmdButton)CommandButtonEvents::DispEventAdvise((IDispatch*)mspCmdButton)释放的时候OnDisconnection加入代码CommandButtonEvents::DispEventUnadvise((IDispatch*)mspCmdButton)CommandButtonEvents::DispEventUnadvise((IDispatch*)mspCmdButton)编写word菜单插件创建菜单和创建按基本相似在创建、响应、连接的地方添加代码见例程。注意:添加按钮和菜单的时候设置文本、图片、标题、可见、可用但是不能设置Tag属性否则点击菜单和按钮的时候会执行两遍。添加右键菜单的时候会有问题不知道如何响应。关于一些office常量。按照ole方式加入:添加类类型库里面的MFC类从文件或者注册表导入选择要添加的类。这种添加方式不会产生常量。按照atl方式加入:#importmsodll方式加入这样编译器会产生常量。注意事项注册ATL注册:如果本模块基于其他的DLL注册的时候会链接相应的DLL一定要能找到。编译器链接之后会自动注册如果拷贝到其他地方要重新注册。连接返回值MS插件OnConnection连接的时候一定要返回SOK。否则系统会认为连接的时候出现了异常没有连接上下次不会加载插件。加载好的按钮、菜单已经加载好的按钮、菜单WSoffice会保存起来下次加载模块的时候应该检验不要重新加载好几次。可以断开前删除:用户拖动工具条的位置不会保存。可以加载前删除以前的:缺点同上还有就是不加载也会有按钮。可以加载时候检查修改:还有就是不加载也会有按钮。word编程知识点调用word对话框CDialogsdlgs=wordApp>getDialogs()CDialogdlg=dlgsItem(wdDialogFileSaveAs)另存为dlgDisplay(timeout)之显示窗口不执行代码dlgShow(timeout)显示窗口如果是保存对话框真正保存timeout可选参数对话框自动关闭不添为不自动关闭单位毫秒。返回值“关闭”按钮。“确定”按钮。“取消”按钮。>命令按钮代表第一个按钮代表第二个按钮以此类推。目录的自动生成把光标定位到文章第页的首行第个字符左侧(目录应在文章的前面)执行菜单命令“插入引用索引和目录”打开“索引的目录”对话框在对话框中单击“目录”选项卡进行相关设置后单击“确定”按钮文章的目录自动生成完成。**友情提示**目录页码应该与正文页码编码不同。把光标定位在目录页末执行“插入分隔符下一页确定”操作在目录与正文之间插入分页符执行“视图页眉和页脚”命令把光标定位到正文首页的页脚处单击“页眉和页脚”工具栏上的“链接到前一个”按钮正文页脚与目录页脚的链接页码”命令在“格式”中选择页码格式、选中“起始页码”为“”单击“确定。执行“插入至此完成正文的页码插入。目录如果是多页插入页码时可以选择与正文页码不同的页码格式。当然如果目录只有一页没有必要插入页码。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/12

编写office插件&#46;doc

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利