
如何使用C++开发WPSOffice插件
WPS Office的插件由一个实现了特定接口的DLL、一个XML配置文件以及插件本身需要的其他文件组成。
WPS Office 插件DLL实际上是一个实现了_IDTExtensibility2接口的COM组件。
1._IDTExtensibility2 插件DLL要导出COM要求的DllCanUnloadNow、DllGetClassObject、DllRegisterServer和DllUnregisterServer四个函数,并实现_IDTExtensibility2接口。
_IDTExtensibility2接口的定义在Kingsoft Add-In Designer类型库中,导入ksaddndr.dll就可以使用这个接口。
#import "C:\Program Files\Kingsoft\WPS Office Personal\office6\ksaddndr.dll" named_guids, raw_interfaces_only interface_IDTExtensibility2: IDispatch { virtual HRESULT __stdcallOnConnection( /*[in]*/ IDispatch * Application, /*[in]*/ enum ext_ConnectMode ConnectMode, /*[in]*/ IDispatch * AddInInst, /*[in]*/ SAFEARRAY * * custom ) = 0; virtual HRESULT __stdcallOnDisconnection( /*[in]*/ enum ext_DisconnectMode RemoveMode, /*[in]*/ SAFEARRAY * * custom ) = 0; virtual HRESULT __stdcallOnAddInsUpdate( /*[in]*/ SAFEARRAY * * custom ) = 0; virtual HRESULT __stdcallOnStartupComplete( /*[in]*/ SAFEARRAY * * custom ) = 0; virtual HRESULT __stdcallOnBeginShutdown( /*[in]*/ SAFEARRAY * * custom ) = 0; }; 插件安装时,WPS Office会将插件DLL注册(DllRegisterServer)到系统中。
WPS Office启动时,将通过插件平台(管理插件的模块)加载插件。
插件平台通过COM方式创建一个_IDTExtensibility2对象,然后调用_IDTExtensibility2.OnConnection。
插件可以在OnConnection中做一些初始化操作,如添加菜单项、工具栏按钮等。
OnConnection之后,OnStartupComplete将被调用,至此插件加载完成。
WPS关闭时,插件平台先后调用OnBeginShutdown和OnDisconnection。
目前,WPS Office插件平台不会调用插件的_IDTExtensibility2.OnAddInsUpdate方法。
插件实现一个空的OnAddInsUpdate就可以了,即直接返回S_OK,应避免在其中编写其他代码,以免将来引起兼容问题。
1.1._IDTExtensibility2.OnConnection virtual HRESULT __stdcallOnConnection( /*[in]*/ IDispatch *Application, /*[in]*/ enumext_ConnectModeConnectMode, /*[in]*/ IDispatch * AddInInst, /*[in]*/ SAFEARRAY * * custom); OnConnection方法一共带有4个参数。
第一个参数Application是宿主程序对象;第二个参数是ext_ConnectMode类型的枚举值;第三个和第四个参数目前没有使用,插件实现OnConnection时必须忽略这两个参数。
ext_ConnectMode定义了4个常量值,如下所示。
enumext_ConnectMode { ext_cm_AfterStartup = 0, ext_cm_Startup = 1, ext_cm_External = 2, ext_cm_CommandLine = 3 }; 其中,ext_cm_Startup和ext_cm_AfterStartup是插件平台加载COM插件时传入OnConnection的。
ext_cm_External和ext_cm_CommandLine目前没有用到。
a.ext_cm_Startup WPS启动时,插件平台会立即加载COM插件,调用OnConnection(Application, ext_cm_Startup)。
b.ext_cm_AfterStartup 用于安装插件过程。
安装插件时,WPS Office插件平台会加载插件,并调用OnConnection(Application, ext_cm_AfterStartup),此时插件要做两件事情,即安装后的初始化以及加载初始化。
如果插件安装以后不需要进一步的配置等初始化工作,那么对这个插件而言,不需要区分ext_cm_AfterStartup和ext_cm_Startup。
一般情况下,插件会在OnConnection中添加菜单项或者工具栏按钮等功能入口。
在WPS Office添加的菜单项或者工具栏按钮,分为“临时”和“持久”两种类型。
顾名思义,带有“临时”属性的菜单项或工具栏按钮,在WPS Office重新启动以后就不存在了;带有“持久”属性的菜单项或工具栏按钮,在WPS Office重新启动以后,仍然存在。
插件添加菜单项和工具栏按钮时,推荐使用“临时”的菜单项和工具栏按钮,在宿主程序关闭时,插件也不要调用API删除菜单或工具栏按钮。
插件添加菜单项或工具栏按钮时,建议先检查这些菜单或按钮是否已经存在,以免重复添加。
1.2._IDTExtensibility2.OnStartupComplete 插件平台加载插件过程中,会先后调用OnConnection和OnStartupComplete。
如果插件需要在插件启动以后(OnConnection执行完之后)做一些事情,可以将这些工作放到OnStartupComplete中执行。
大多数情况下,插件可以实现一个空的OnStartupComplete,返回S_OK即可。
1.3._IDTExtensibility2.OnBeginShutdown WPS Office关闭过程中,插件平台会调用OnBeginShutdown,通知插件做清理工作,如保存配置、终止未完成的工作、释放系统资源等。
OnBeginShutdown在OnDisconnection之前被调用。
1.4._IDTExtensibility2.OnDisconnection OnDisconnection和OnConnection相对应,插件在OnConnection中添加菜单或工具栏命令、注册事件通知,OnDisconnection则注销事件通知。
virtual HRESULT __stdcallOnDisconnection( /*[in]*/ enumext_DisconnectModeRemoveMode, /*[in]*/ SAFEARRAY * * custom) ;
为什么电路方程里有Uc=1/c∫idt?
展开全部 用Visual Studio 2012创建名为MyVisualStudioAddin的项目(根据向导进行设置,这里不赘述),界面如下:核心 Connect 类插件入口就是Connect 类,先看一下Connect的类图:Connect 实现外接程序对象的构造函数。
请将您的初始化代码置于此方法内。
OnConnection 实现 IDTExtensibility2 接口的 OnConnection 方法。
接收正在加载外接程序的通知。
OnDisconnection 实现 IDTExtensibility2 接口的 OnDisconnection 方法。
接收正在卸载外接程序的通知。
OnAddInsUpdate 实现 IDTExtensibility2 接口的 OnAddInsUpdate 方法。
当外接程序集合已发生更改时接收通知。
OnStartupComplete 实现 IDTExtensibility2 接口的 OnStartupComplete 方法。
接收宿主应用程序已完成加载的通知。
OnBeginShutdown 实现 IDTExtensibility2 接口的 OnBeginShutdown 方法。
接收正在卸载宿主应用程序的通知。
QueryStatus 实现 IDTCommandTarget 接口的 QueryStatus 方法。
此方法在更新该命令的可用性时调用。
Exec 实现 IDTCommandTarget 接口的 Exec 方法。
此方法在调用该命令时调用。
_applicationObject 是DTE2实例,是宿主应用程序的根对象。
_addInInstance是当前插件实例,表示此外接程序的对象。
首先定义一些内部的对象,主要是自定义的命令,如下所示:1 /// 用于实现外接程序的对象。
2 /// 3 public class Connect : IDTExtensibility2, IDTCommandTarget 4 { 5 #region 命令定义 除了FindInSolutionExplorer外,此处的命令不是根据功能来命令的,而是根据命令所出现的位置来命令的 6 private readonly string MY_COMMAND_FindInSolutionExplorer = "FindInSolutionExplorer"; 7 private readonly string MY_COMMAND_Project = "cmdInProject";//在项目上 8 private readonly string MY_COMMAND_Solution = "cmdInSolution";//在解决方案上 9 private readonly string MY_COMMAND_MenuBar = "cmdInMenuBar";//在菜单栏上10 private readonly string MY_COMMAND_CodeWindow = "cmdInCodeWindow";//代码窗口11 private readonly string MY_COMMAND_Files = "cmdInFiles";12 #endregion13 14 private Command findCommand = null;15 private CommandBarButton findCommandBarButtonButton = null;16 private AddInLogger logger = null;17 18 private DTE2 _applicationObject;19 private EnvDTE.AddIn _addInInstance;20 ......21 }
如何在Visual Studio中开发自己的代码生成器插件
用Visual Studio 2012创建名为MyVisualStudioAddin的项目(根据向导进行设置,这里不赘述),界面如下: 核心 Connect 类 插件入口就是Connect 类,先看一下Connect的类图: Connect 实现外接程序对象的构造函数。
请将您的初始化代码置于此方法内。
OnConnection 实现 IDTExtensibility2 接口的 OnConnection 方法。
接收正在加载外接程序的通知。
OnDisconnection 实现 IDTExtensibility2 接口的 OnDisconnection 方法。
接收正在卸载外接程序的通知。
OnAddInsUpdate 实现 IDTExtensibility2 接口的 OnAddInsUpdate 方法。
当外接程序集合已发生更改时接收通知。
OnStartupComplete 实现 IDTExtensibility2 接口的 OnStartupComplete 方法。
接收宿主应用程序已完成加载的通知。
OnBeginShutdown 实现 IDTExtensibility2 接口的 OnBeginShutdown 方法。
接收正在卸载宿主应用程序的通知。
QueryStatus 实现 IDTCommandTarget 接口的 QueryStatus 方法。
此方法在更新该命令的可用性时调用。
Exec 实现 IDTCommandTarget 接口的 Exec 方法。
此方法在调用该命令时调用。
_applicationObject 是DTE2实例,是宿主应用程序的根对象。
_addInInstance是当前插件实例,表示此外接程序的对象。
首先定义一些内部的对象,主要是自定义的命令,如下所示: 1 /// 用于实现外接程序的对象。
2 /// 3 public class Connect : IDTExtensibility2, IDTCommandTarget 4 { 5 #region 命令定义 除了FindInSolutionExplorer外,此处的命令不是根据功能来命令的,而是根据命令所出现的位置来命令的 6 private readonly string MY_COMMAND_FindInSolutionExplorer = "FindInSolutionExplorer"; 7 private readonly string MY_COMMAND_Project = "cmdInProject";//在项目上 8 private readonly string MY_COMMAND_Solution = "cmdInSolution";//在解决方案上 9 private readonly string MY_COMMAND_MenuBar = "cmdInMenuBar";//在菜单栏上10 private readonly string MY_COMMAND_CodeWindow = "cmdInCodeWindow";//代码窗口11 private readonly string MY_COMMAND_Files = "cmdInFiles";12 #endregion13 14 private Command findCommand = null;15 private CommandBarButton findCommandBarButtonButton = null;16 private AddInLogger logger = null;17 18 private DTE2 _applicationObject;19 private EnvDTE.AddIn _addInInstance;20 ......21 }
标准中的Eqv、Idt和Neq分别代表什么 详细??
(1)Idt 等同采用。
国家标准等同于国际标准,仅有或没有编辑性修改。
根据ISO/IEC 导则21 的定义,是指不改变标准技术的内容的修改。
如纠正排版或印刷错误;标点符号的改变;增加不改变技术内容的说明、指示,等等。
可见,等同采用就是指国家标准与国际标准相同,不做或稍做编辑性修改。
(2)Eqv 等效采用。
国家标准等效于国际标准,技术上只有很小差异。
可见,等效采用就是技术内容上有小的差异、编辑上不完全相同。
所谓技术上的很小的差异,1SO/IEC 导则21 中定义为:国家标准与国际标准之间的小的技术差异是指,一种技术上的差异在国家标准中不得不用,而在国际标准中也可被接受,反之亦然。
如,奥地利标准ONORMS 5022 内河船舶噪声测量标准中,包括一份试验报告的推荐格式,而相应的国际标准ISO 2922 中没有此内容。
(3)Neq 非等效采用。
国家标准不等效于国际标准。
这是ISO/1EC 导则21 中规定的第三种等效程度。
非等效采用时,国家标准与国际标准在技术上有重大差异。
国家标准与国际标准在技术上的重大差异?在ISO/IEC 导则21 的补充件《国家标准与国际标准之间等效程度的标记》中,都明确规定了重大技术差异或不等效于国际标准所包括的几种情况: ISO/1EC 导则21 中指出,国家标准与国际标准间的重大技术差异,指国家标准中有国际标准不能接受的条款,或者在国际标准中有国家标准不能接受的条款。
导则中同时指出,在技术上有重大差异的情况下,虽然国家标准制定时是以国际标准为基础,并在很大程度上与国际标准相适应,但不能使用"等效"这个术语。
在1SO/1EC 导则21 的补充件中指出,包括以下3 种情况: ①"国家标准包含的内容比国际标准少",国家标准较国际要求低或选国际标准中部分内容。
国家标准与国际标准之间没有互相接受条款的"逆定理"情况。
②"国家标准包含的内容比国际标准多",国家标准增加了内容或类型,且具有较高要求等,也没有"逆定理"情况。
⑧国家标准与国际标准有重迭,部分内容是完全相同或技术上相同,但在其他内容上却互不包括对方的内容。
标准“备案”的作用主要有以下作用: 1. 可以了解标准的制定情况,特别是便于检查企业生产的产品是否制定了标准。
如果企业生产的产品,既没有国家标准,又没有行业标准,也没有制定企业标准,就可以监督、帮助企业尽快制定企业标准。
2. 便于发现行业标准、地方标准或企业标准是否遵守有关强制性标准的情况。
如果发现有违背的情况,可以及时予以纠正或停止执行相应的标准。
3. 对于企业的产品标准来说,当供需双方由于产品贸易发生争议时,标准化行政主管部门可以依据合同规定的企业产品标准进行仲裁和检验。
这个企业标准,应该是已备案的标准,而不是企业随意选用的标准。
什么是采标,采标的原则是指什么: 采标是采用国际标准和国外先进标准的简称,是指将国际标准或国外先进标准的内容,经过分析研究,不同程度地转化为我国标准并贯彻实施。
我国标准采用国际标准或国外先进标准的程度,分为等同采用、等效采用和非等效采用三种。
我国标准化工作"九五"计划和2010 年远景目标纲要中指出:要采取措施,加快采用国际标准和国外先进标准的步伐,要认真落实采标政策,力争"九五"末实现主要行业采标率达到70%以上的目标。
采标的原则是: 1. 应当符合我国有关法律和法规,保障国家安全,保护人体健康和人身、财产安全,保护动植物的生命和健康,保护环境,做到技术先进、经济合理、安全可靠。
2. 凡已有国际标准(包括即将制定完成的国际标准),应当以其为基础制定我国标准。
凡尚无国际标准或国际标准不能适应需要,应当积极采用国外先进标准。
3. 对国际标准中的安全标准、卫生标准、环境保护标准和贸易需要的标准应当先行采用,并与相关标准相协调。
4. 采用国际标准和国外先进标准,应当同我国的技术引进、技术改造、新产品开发相结合。
在技术引进中,要优先引进有利于产品质量和性能达到国际标准和国外先进标准的技术设备和有关的技术文件;技术改造、新产品开发应积极采用国际标准和国外先进标准。
标准编写的十二要素是指: 名称应由几个尽可能短的要素组成,其顺序由一般到特殊。
通常,所使用的要素不多于下述三种: a) 引导要素(可选):表示标准所属的领域。
b) 主体要素(必备):表示在上述领域内所要论述的主要对象。
c) 补充要素(可选):表示上述主要对象的特定方面,或给出区分该标准(或该部分)与其他标准(或其他部分)的细节。
详细规则见GB/T 1.1-2000 的6.2.1 和附录D。
目 次 目次为可选要素。
如果需要,可设置目次。
目次所列的内容和顺序如下: ——前言; ——引言; ——章; ——带有标题的条(需要时列出); ——附录,应在圆括号中标明其性质,即“(规范性附录)”或“(资料性附录)”; ——附录的章和带有标题的条(需要时列出); ——参考文献; ——索引; ——图(需要时列出); ——表(需要时列出)。
在目次中应列出完整的标题。
“术语和定义”一章中的术语不应在目次中列出。
前 言 每项标准均应有前言。
...
c:\windows\syster32\rudll32.exe
找不到rundll32.exe rundll32.exe是系统的一个核心文件,与许多文件的关联有关系。
同时它也是多种病毒感染的目标之一,由于错误删除(例如杀毒软件)可能导致系统提示:找不rundll32.exe文件。
这样会导致大部分文件打开时提示需要指定打开方式,同时,控制台也无法打开,不能进入控制面板。
下面是微软官方提供的解决办法: 1. 将 Windows XP 光碟片放入光碟机中。
2. 按一下 [开始],然后按一下 [执行]。
3. 在 [开启] 方块中输入 expandX:\i386\rundll32.ex_ c:\windows\rundll32.exe,其中 X 是您光碟机的代号。
4. 重新启动电脑。
如果没有系统盘,可以用一下方法恢复: 新建文本文件,键入一下代码: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\exefile\shell\open\command] 另存为-文件格式-选择-所有文件,文件名:11.reg(windows注册表文件),双击文件。
这个时候会出现提示,是否写入注册表,点击ok即可。
如果在运行中键入regedit或者找到c://windows/regeidt.exe直接运行,都可能报错说无法找到rundll32.exe,因为exe文件的关联是与rundll32相关的,但是仍然可以通过reg文件导入注册表键值。
或者:开始-运行 输入CMD 然后跳出选择程序的方式 你选择 C盘WIN目录下的SYSTEM32目录-找到CMD.EXE 选择确定 然后输入下面那行 按回车应该就可以了assoc .exe=exefile(assoc与.exe之间有一空格)
如何在outlook添加add in
首先,我要说一下什么是插件(Add-in) 插件一般是对现有程序的扩展,微软的Office系统公开了一套接口,可以很方便地让开发人员基于这些接口去实现对Office应用程序的增强。
这个接口,准确地说,就是Extensibility.IDTExtensibility2. 当然,除了Office,有很多应用程序都支持类似的扩展机制,例如IE,以及Visual Studio本身,都支持一定程序的扩展。
其次,我要说一下以前是怎么开发插件Add-in的 开发Office插件(Add-in)的途径有各种各样的,我大致总结分为三类: VBA 开发:这个是基于Visaul Basic for Application这套开发模型做的一些定制。
这种定制的限制比较多一些,但开发难度相对来说更加低一些。
做过VBA开发的朋友都知道,VBA是脱离不了应用程序本身的。
例如Excel的VBA编辑器如下图所示 VC++,Visual Basic开发:这种开发方式允许我们在VC++,或者VB 6中,直接实现Extensibility.IDTExtensibility2这套接口,并且可以更加灵活,做更加强大的一些定制。
目前的Office应用程序中,默认就安装好了的一些插件,都是这种方式做的。
例如下图是我的Outlook默认安装的一些插件列表 【备注】很早之前,我也用VB 6做过这方面的开发。
但现在基本连VB 6的安装程序都找不到了。
所以这里就不截图了,其实就是有一个项目模板,然后实现接口。
开发这种插件,关键在于对Office本身内部的一些对象模型熟悉。
VSTO开发:所谓VSTO,全称是Visual Studio Tools for Office.我记得是从VS 2003开始提供了VSTO 1.0,简而言之,就是允许在.NET的开发环境中开发Office应用程序或者插件。
这种方式有着显而易见的好处,就是能力增强,因为可以用到.NET的整套框架。
VSTO发展到现在有几个版本,分别如下 VS 2003: VSTO 1.0 VS 2005: VSTO 2.0 VS 2008: VSTO 3.0 VS 2010: VSTO 4.0 VSTO 之前的版本有一些不太好的地方是部署,不要小看部署这个环节。
如果你曾经花了很多精力写出来了一个很好的插件,但是因为各式各样的部署问题导致没有办法很顺利地分发给你的用户,那种感觉是很让人沮丧的。
VSTO的解决方案有相当多的一些环境依赖,另外还需要提升.NET中的安全策略等等。
一个好消息是,现在的新版本中,开发和部署将是相对更加容易了。
在开发方面,模板更加好用,也提供了对Ribbon的内置支持,部署方面,我们可以通过ClickOnce技术发布到网站,或者打包成一个vsto压缩包文件,很容易地进行部署。
本文我们就来用一个简单例子进行说明。
然后,我们来看看在新版的开发工具中,如何快速高效地开发插件(Add-in) 作为演示,我主要侧重于开发和部署的流程。
我们要实现的一个插件,其场景比较简单: 我们需要在Outlook中添加一个新的Ribbon按钮,该按钮点击之后,可以弹出一个窗口,允许我们从Excel文件中导入联系人 那就让我们开始吧 第一步:创建一个Add-in项目 这个项目模板会自动创建下面的项目结构 【备注】在ThisAddin这个类中,可以很方便地访问到Outlook的当前实例,只要使用如下的代码即可 this.Application 第二步:添加一个Ribbon 我们需要为Outlook添加一个新的Ribbon按钮,事实上这很容易做到。
我们选择Ribbon(Visual Designer),这样就可以在可视化界面中设计了 我们首先需要设置一下,这个Ribbon是在什么地方要显示。
在下图中,我们将RibbonType修改为Microsoft.Outlook.Explorer,这样的意思是说,我们这个Ribbon是现在在Outlook默认的那个管理器窗口中的 接下来,我们可以添加一个按钮到group1中去。
工具箱中有很多可用的控件 我最好做好的Ribbon看起来像下面这样 第三步:实现简单的逻辑 接下来,我们可以为这个按钮实现简单的逻辑 通过双击该按钮,会产生一个事件处理器 我简单地实现代码如下 using System;using System.Collections.Generic;using System.Linq;using System.Text;using Microsoft.Office.Tools.Ribbon;using System.Windows.Forms;namespace OutlookAddInSample{public partial class MyRibbon{private void MyRibbon_Load(object sender, RibbonUIEventArgs e){}private void btImport_Click(object sender, RibbonControlEventArgs e){Form form = new Form(){Text = "Import Contacts from Excel File",StartPosition=FormStartPosition.CenterScreen};form.Show();}}} 第四步:调试 完成如上的操作之后,一个最简单的Add-in就做好了。
那么如何进行调试呢? 没错,直接按F5就可以进行调试了。
此时,Outlook会自动打开,然后我们的Ribbon也确实能看到了 点击该按钮,我们也确实可以看到一个窗口被显示出来了 同时,我们在Outlook的选项对话框中也能看到这个插件的信息 第五步:发布 如果我们在本机做好了调试,那么如何分发给用户呢?以前我们一般会制作一个MSI的安装程序,现在你依然可以这么做。
但我今天主要介绍的是一种更加方便的部署方式,就是通过ClickOnce技术发布到网站或者文件夹中。
【注意】这里的location是可以有下面几种的。
但我这里保持默认的选择,直接发布到一个文件夹 发布如果没有遇到什么错误的话,会生成下面的一个目录 我们一般可以将这个目...
转载请注明出处51数据库 » c idtextensibility
清早起床撸啊撸