原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项

一、加载项简介

Office提供了多种用于扩展Office应用程序功能的模式,常见的有:

1、Office 自动化程序(Automation Executables)

2、Office加载项(COM or Excel Add-In)

3、Office文档代码或模板(Code Behind an Office Document or Template)

4、Office 智能标签(Smart Tags)

本次我们将学习使用VSTO 4.0编写一个简单的Office COM 加载项,构建于Office 2010 x64.

示例代码下载

本系列所有示例代码均在 Visual Studio 2010 Ultimate RC 和 Office 2010 Professional Plus Beta x64 中测试通过。

二、为什么要使用加载项

Office加载项提供了一种扩展应用程序核心功能的机制,由此添加的功能可以在整个应用程序或单个应用程序中使用,极大的扩充了Office的应用领域:

1、扩展现有功能:对于特定需求,特别是和业务紧密相关的需求,如果能够以加载项的方式在Office中解决,那么将节省软件成本、培训成本等。

2、数据整合:随着Office由办公平台正式转变为一个计算平台之后,将Office与其他平台进行整合的需求也变得愈来愈频繁。如将Web服务器中数据导入到Excel中,将SAP系统中数据导入到Excel中,生成日报表等。

三、COM加载项的工作原理

要使用COM加载项,必须要在注册表中写入相应的信息。Office 要判断使用哪些加载项时,以Excel为例,需要查看注册表中的两个位置:

(PS:推荐一个注册表编辑器Registry Workshop,功能很强大,支持64位,可以在这里下载)

1、HKEY_CURRENT_USER\Software\Microsoft\Office\Excel\AddIns

这个位置是针对于特定用户的,也是推荐的位置。在该位置注册的COM加载项将出现在Office中的COM加载项对话框中:

在该位置,有几项是必备的。

1)FriendlyName:字符串值,包含了显示在COM对话框中的COM加载项的名称;

2)Description:字符串值,包含了COM加载项的简短描述信息;

3)LoadBehavior:DWORD类型,用于描述COM加载项的加载方式,通常设置为3(1 + 2).

描述

0

断开,不加载COM加载项

1

连接,加载 COM加载项

2

启动时加载,主应用程序启动时加载并连接COM加载项

8

需要时加载,主应用程序需要(触发加载事件)时加载并连接COM加载项

16

首次连接,用户注册加载项后,首次运行主应用程序时加载并连接COM加载项

除了上面的三个,还需要在HKEY_CLASSES_ROOT\CLSID下创建几个注册表项:

2、HKEY_LOCAL_MACHINE\Software\Microsoft\Office\Excel\AddIns

这个位置是针对于所有用户的,但是这些加载项对用户隐藏,即不会出现在COM加载项对话框中。

这些注册表项如果纯手工写将会非常麻烦,而且容易出错,幸运的是,Visual Studio提供了一组模板来方便的创建Office加载项,但是我们还是应该理解这些注册表项及其代表含义。

四、理解IDTExtensibility2接口

所有Office应用程序都是用IDTExtensibility2接口与COM加载项进行通信,该接口提供了一种通用的初始化机制,并具有在Office应用程序的对象模型中传递数据的能力,因此COM加载项可以与Office应用程序通信。

IDTExtensibility2接口并不复杂,但是对于标注COM加载项的加载顺序,以及它在何处影响我们编写的代码来说,此接口至关重要。Office在对COM加载项进行实例化时,会创建主Connect类,注意不能用Connect的构造函数创建类的实例,应该用OnConnection方法;类似的,加载项的关闭不能调用析构函数,而要用OnDisconnection方法。

五、ExcelCOMAddInDemo

现在我们来动手开发一个简单的Excel COM Add-In.

1、新建一个Share Add-In项目:

2、在弹出的项目向导中,点击【Next】:

3、选择你所熟悉的语言,点击【Next】:

4、选择COM 加载项的目标宿主,点击【Next】:

5、输入Add-In的名称和描述,点击【Next】:

6、选择"启动时加载",点击【Next】:

7、点击【Finish】:

8、项目建立完成后会自动添加一个安装项目,它会负责安装生成的COM加载项,处理注册表的信息等,无需我们手动参与。

64-bit Support and Code Compatibility

Office 2010 will ship in both 32- and 64-bit versions. 64-bit is particularly significant to some Excel applications, which hit a wall today in terms of available memory address space. This is an important topic in itself, which we have covered here.

Excel workbooks can be freely opened and edited in both 32- and 64-bit Excel; there is nothing architecture specific in a saved workbook. For custom code solutions, however, 64-bit Excel introduces some challenges:

  • ActiveX controls need to be ported – they need a 64-bit version to work in a 64-bit process. This includes Microsoft's own controls, of which many have been ported. We are evaluating the popularity and criticality of the remaining ones for possible porting.
  • COM add-ins, similarly, need to be compiled for 64-bit in order to work in 64-bit Excel.
  • XLL add-ins also need to be compiled for 64-bit, and the new Excel 2010 XLL SDK supports that.
  • VBA: Embedded VBA code gets re-compiled when the containing Excel workbook is opened on a new platform; 64-bit Excel now includes a 64-bit version of VBA. So most VBA code just works in 64-bit. However, a subset of VBA solutions needs some tweaking. It has to do with declarations and calls to external APIs with pointers/handles in the parameter list. VBA7, the new version of VBA that ships with Office 2010, supports the development of code that can run in both 32- and 64-bit Office.

摘自Excel 2010官方博客,可以看出,在Office 2010 x64中,必须编写64位的COM Add-In.

这不是问题,稍后我们将看到如何编译64位的COM Add-In和生成64位的安装文件。

9、设置项目属性:

在【Build】标签中,将【Platform】设置为:Active(x64),取消【Register for COM】的选择:

在【Debug】标签中,将【Platform】设置为:Active(x64),同时将【Start Action】设置为Excel的安装路径,这样做可以启动Excel来调试COM Add-In:

配置编译选项:

配置安装项目属性:

10、我们要做的是在Excel 的Ribbon中添加一个按钮,点击后弹出一则欢迎信息。

首先添加引用:

Microsoft.Office.Interop.Excel

System.Windows.Forms

打开Connect.cs,添加如下代码:

代码

);
                simpleButton.Caption = "Excel COM Addin";
                simpleButton.Style = MsoButtonStyle.msoButtonCaption;
            }

            // Make sure the button is visible
            simpleButton.Visible = true;
            simpleButton.Click += new _CommandBarButtonEvents_ClickEventHandler(simpleButton_Click);

            standardBar = null;
            commandBars = null;
        }

        /// <summary>
        ///      Implements the OnBeginShutdown method of the IDTExtensibility2 interface.
        ///      Receives notification that the host application is being unloaded.
        /// </summary>
        /// <param term='custom'>
        ///      Array of parameters that are host application specific.
        /// </param>
        /// <seealso class='IDTExtensibility2' />
        public void OnBeginShutdown(ref System.Array custom)
        {
        }

        void simpleButton_Click(CommandBarButton ctrl, ref bool cancelDefault)
        {
            MessageBox.Show("Welcome to COM Add In");
        }
    }
}

声明了一个CommandBarButton的实例,然后将其添加到CommandBar中,并关联了一个Click事件,输出一则欢迎信息。

11、编译成功后,安装生成的setup.exe,执行安装:

12、安装成功后,打开Excel,会在【Add-In】中发现我们新添加的按钮:

六、调试COM加载项

1、通过前面的设置为Excel启动来进行调试,这也是首先的方法,很方便。

2、可以通过附加Excel进程的方式来进行调试:

七、小结

本次主要学习了COM 加载项的开发流程,对使用托管代码开发COM组件有了初步的认识,尤其是IDTExtensibility2接口,在VSTO开发中占据重要地位,理解其与COM交互的过程是很有必要的。其次是64位COM加载项的部署问题,与32位传统加载项有些区别,请注意区别对待。后续篇章会继续深入介绍VSTO开发的内容,及其与其他技术的整合。

VSTO学习笔记(三) 开发Office 2010 64位COM加载项的更多相关文章

  1. tensorflow学习笔记(三十四):Saver(保存与加载模型)

    Savertensorflow 中的 Saver 对象是用于 参数保存和恢复的.如何使用呢? 这里介绍了一些基本的用法. 官网中给出了这么一个例子: v1 = tf.Variable(..., nam ...

  2. VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

    原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Exce ...

  3. Android 学习笔记之Volley(八)实现网络图片的数据加载

    PS:最后一篇关于Volley框架的博客... 学习内容: 1.使用ImageRequest.java实现网络图片加载 2.使用ImageLoader.java实现网络图片加载 3.使用NetWork ...

  4. 64位MicrosoftOfficeWord加载EndnoteX7

    来源:http://jingyan.baidu.com/article/fcb5aff7a08036edaa4a71d0.html Win10 64bit 安装 Office2016 64bit 加载 ...

  5. VSTO 学习笔记(十)Office 2010 Ribbon开发

    原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...

  6. 【VS开发】VSTO 学习笔记(十)Office 2010 Ribbon开发

    微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个Ribbon中,便于集中管理.操作.这种Ribbon是高度可定制的,用户可 ...

  7. 【JAVAWEB学习笔记】网上商城实战2:异步加载分类、Redis缓存分类和显示商品

    网上商城实战2 今日任务 完成分类模块的功能 完成商品模块的功能 1.1      分类模块的功能: 1.1.1    查询分类的功能: 1.1.2    查询分类的代码实现: 1.1.2.1  创建 ...

  8. PHP7 学习笔记(四)PHP PSR-4 Autoloader 自动加载

    参考文献: 1.PHP PSR-4 Autoloader 自动加载(中文版) 2.PHP编码规范(中文版)导读 3.PHP-PSR-[0-4]代码规范 基本步骤: (1)在vendor 下新建一个项目 ...

  9. 64位直接加载个img 标签的src

随机推荐

  1. VC动态轨迹画线

    分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...

  2. Oracle闪回flashback总结

    1.说明: Ø  采用的技术. 使用的是多个技术. 1.      闪回日志 2.      回收站 3.      回滚段 无法使用回收站的操作 Drop table xxx purge; Drop ...

  3. windows下建立文件的换行符^M导致linux下的shell脚本执行错误的解决方式

    常常在windows下编辑的文件远程传送到linux下的时候每行末尾都会出现^M.这将导致shell脚本执行错误,主要是由于dos下的编辑器和linux下的编辑器对文件末行的回车符处理不一致导致. 主 ...

  4. EasyUI - DateBox组件

    效果: html代码: <input type ="text" id ="box" /> JS代码: $(function () { //设置返回格 ...

  5. TCP与UDP在socket编程中的区别 (网络收集转载)

    http://blog.chinaunix.net/uid-26421509-id-3814684.html 一.TCP与UDP的区别 基于连接与无连接  对系统资源的要求(TCP较多,UDP少)  ...

  6. 基于visual Studio2013解决面试题之0701寻找丑数

     题目

  7. AFNetwork学习(二)——GET/POST请求

    为了学习AFNetwork,自己搭建整理了一下AFNetwork向后台发送请求和后台返回json数据的整个处理过程.利用Struts2搭建了一个后台,提供Action并返回json数据 环境:Xcod ...

  8. vector中的find

    vector中的find - huangyimin的专栏 - 博客频道 - CSDN.NET vector中的find 2011-01-13 09:57 11334人阅读 评论(0) 收藏 举报 ve ...

  9. 关于Android配色 自适应颜色的实现

    在Android4.4系统中,更加详细地介绍了关于颜色的细节并提供了使用colour的新教程,以使我们的应用更加独一无二.也就是说,作为一个设计师或者开发者,为你的APP做完美的配色已经变成了你的职责 ...

  10. 简单概率dp(期望)-zoj-3640-Help Me Escape

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4808 题目大意: 有n条路,选每条路的概率相等,初始能力值为f,每 ...