使用 Tangram Extension Tools for Application 扩展 Office 2007
一种使用 MFC/ATL 和 .NET 技术扩展 Microsoft Office 2007 用户界面的新方法。
引言
嗨,圣诞快乐! 本文是来自中国北京的 Tangram 团队送给 Codeproject 开发者的礼物。在本文中,我们将讨论一种使用 MFC/ATL 和 .NET 技术扩展 Microsoft Office 2007 用户界面的新方法。
1. 扩展 Microsoft Office 2007 用户界面
微软已随 Visual Studio 2008 提供了最新版本的 Visual Studio Tools for Office (VSTO),通过使用 VSTO,人们可以利用任务窗格和功能区组件来扩展 Office UI。但是我们能否深入到 Microsoft Office UI 框架的内部?我们能否提供一些新的 UI 元素,它们可以与现有的 Office UI 元素(而不是功能区或任务窗格)共存?
2. 一些快照
通过使用本文介绍的方法,开发人员可以如下扩展 Office UI
(除了功能区和任务窗格,我们还可以在 MS Word 内部通过一个新的 UI 框架来扩展 MS Word UI,你可以看到 Word 文档区域看起来像是嵌入式 UI 框架的一个“视图”)
当用户在上面扩展的 Word UI 中激活另一个页面时,我们会得到一个新的 UI 场景
(MS Word 成为某个软件系统的新工作区)
在运行时,其他扩展的 UI 框架可以加载到 MS Word 的工作区域,就好像 MS Word 变成了一个正在导航新 HTML 页面的 Web 浏览器
(在运行时,由 Tangram Extension Tools for Application 在 MS Word 内部加载的新 UI 框架)
3. Tangram Extension Tools for Application
当您下载并解压缩“Tangram_Extension_Tool.zip”文件后,会得到一个子目录“Tangram_Extension_Tool\Tangram”,您必须将“Tangram”子目录复制到您系统的“Program Files”目录,以确保Tangram Extension Tools for Application正常工作。在“Tangram\bin”目录中,有一个 BAT 文件“Tangram.bat”,它将帮助您注册库文件“TangramDeskManager.dll”,该子目录还包括“TangramDeskManager.dll”和“TangramCommonExtender.dll”。Tangram Extension Tools for Application的源代码位于子目录“Tangram\src”中。
Tangram Extension Tools for Application是 Tangram 基础架构的一个子集,它由两个 Visual C++ 项目组成。第一个是TangramDeskManager,它是基于 MFC/ATL 类库并使用 Visual Studio 2008 开发的,为了正确编译此项目,您需要从 http://www.codeplex.com/AtlServer 下载 ATLServer 库的源代码。第二个是TangramCommonExtender,它是基于 ATL/CLI 并使用 VS2008 开发的。
如果您是 .NET 开发人员,您必须首先注册 TangramDeskManager.dll,然后在您的 .NET 项目中添加对TangramCommonExtender库的引用。如果您是 MFC/ATL 开发人员并希望深入了解其内部,我们建议您深入研究TangramDeskManager项目。
4. Tangram Extension Tools for Application 的一些背景知识
从习惯的角度来看,一个设计良好的桌面软件通常由一个或多个主框架窗口组成,每个主框架窗口都有其自己的客户区窗口,供客户操作。例如,以下是 MS Word 2007 的主框架窗口
(MS Word 主框架窗口:用红色矩形框框出的区域是客户区窗口)
根据开发桌面软件的现代方式,用户区域被主框架的客户区窗口所垄断,其中呈现的功能代表了该软件的主要功能。除了一些菜单和主框架窗口的工具栏外,客户区窗口周围可能还有一些控件条。当用户获得这样一个软件系统时,就好像他得到了一座房子,但“这座房子”的基本框架是不可改变的,其中的起居室被客户区内容永久垄断。然而,如果这个软件设计得足够灵活,开发人员或用户可以在“这座房子”的客户区周围,沿着主框架窗口的边缘添加一些附属的扩展设备,以扩展该软件系统的功能。
对于设计良好的软件,用户期望从中获得更多是完全合理的,即挖掘更多的利益和价值。既然我们将软件系统比作一座房子,我们自然期望,除了“房子”的固有功能外,我们自己提供的软件模块也可以被托管到“这座房子”中,并且在托管后,它们可以与原来的居住者一起占据“起居室”并能相互良好协作(如果需要,原来的居住者甚至可以被隐藏)。一旦一个软件系统具备了这些预期的特性,它将在更广泛的应用中满足更多用户的需求。这个想法的基点是,通过一些神奇的技术来废除原始客户区窗口在用户区域的垄断地位,从而为新的软件功能模块释放新的空间。如果我们能实现这个基点,那么就意味着我们可以将原始客户区窗口移出用户区域,在主框架窗口的用户区域内重建一个新的框架,然后再将原始客户区窗口移回。然而,经过这个过程,情况可能会发生变化,原始客户区窗口失去了其垄断地位,新的空闲空间出现了。这个过程的结果是为其他功能模块留出了新的空间。让我们以 MS Word 为例,我们希望
1. 将 MS Word 的客户区窗口移出; |
|
2. 在 MS Word 的主框架窗口的用户区域内重建一个框架; |
|
3. 将 MS Word 的客户区窗口移回; |
|
4. 允许一些新的用户元素托管到新框架中; |
|
在新元素被托管后,我们可以看到新框架的一个房间被原始客户区窗口占据,原始客户区窗口现在的地位等同于新托管元素的地位。我们期望以这种方式托管的新成员可以享受到 MS Word 基础架构提供的各种“服务”。
从上述讨论中出现了一个重要问题:我们能否重建MS Word 的用户区域?一个更普遍的问题是:我们能否重建有意义的目标软件的客户区? 让我们使用 Microsoft Word 作为我们的目标软件(为了更合理的假设,您可以选择其他有意义的软件作为目标软件,而不是这里讨论的 Microsoft Word),如果我们能实现上述场景,这意味着我们可以将越来越多的软件功能托管到目标软件系统中(这些功能以前不属于它)。从上述讨论的思想中可以推导出许多解释,一旦一个目标软件系统包含一个健壮的应用程序开发模型,就意味着一个有意义的外部对象模型可以自然地托管到目标软件系统中,并能与原始应用程序对象模型相互交互。对于像 MS Office 这样的软件,这意味着我们可以将其置于类似于软件开发平台的地位,这对于开发真正的应用系统非常有意义。
Tangram Extension Tools for Application 致力于解决的一个关键问题是如何重建这些软件系统的客户区。我们期望 Tangram Extension Tools for Application 能够恰当且良好地支持那些支持 COM/.NET 扩展的软件系统。如您所知,一个应用程序软件模型从来都不是完全的,因此,许多软件开发人员总是在他们的软件系统中添加一些可扩展的接口模型,以满足用户日益增长的新需求。Tangram Extension Tools for Application 就是这样一个软件框架,它旨在让开发人员能够将他(她)灵活而健壮的扩展软件模型自然地托管到目标软件系统(如 Microsoft Office、Internet Explorer、Visual Studio 等)中,然后使开发人员能够自然无缝地扩展目标软件系统的用户界面,从而允许扩展的软件模型与目标软件系统的对象模型之间进行良好的交互。
让我们以 Microsoft Office 为例。事实上,Microsoft Office 系统中有许多成熟而健壮的软件技术。通过许多真正的企业开发,大量的软件功能在 Office 系统中得到了完美的实现。基于 Office 系统开发满足特定应用需求的应用程序是一个好主意,但 Office 系统提供给我们的空间仍然有限。对于像 ERP 这样的软件系统,有大量的 UI 元素无法在今天的 Office 框架中自然呈现,即使在最新的 Office 2007 中,也只有部分 UI 可以托管到功能区、任务窗格等中,这对于企业应用来说远远不够。有什么办法可以解决这个问题吗?显然,一旦这个问题得到解决,像 Office 这样的软件系统将为我们基于它进行开发时节省大量的时间和金钱成本。从技术理念上讲,Tangram Extension Tools for Application 正是为这类问题而设计的。其设计目的之一是使开发人员能够在类似 MS Office 的软件系统中呈现许多软件 UI 元素。
5. 使用 Tangram Extension Tools for Application 扩展 Microsoft Office 2007
关于如何使用 Tangram Extension Tools for Application 的演示示例是基于最新版本的 VSTO(Visual Studio 2008 中提供)。此演示项目位于子目录“Tangram\TangramWordVBAddIn”中。
5.1 打开 Visual Studio 2008 并创建一个 VSTO VB 项目
首先,您需要创建一个基于 Visual Basic .NET 的基本 VSTO WordAddin 项目。
5.2 添加对 TangramCommonExtender 组件的引用;
TangramCommonExtender 是 Tangram Extension Tools for Application 的关键组件。通过使用此组件,开发人员可以实现将 .NET WinForm 作为 UI 元素托管到目标软件系统中。在本文中,我们使用此组件将 .NET WinForm 对象作为 Word 2007 软件 UI 框架的一部分进行托管。
5.3 添加一个 Ribbon 对象;
使用类向导向此项目添加一个 Ribbon 组件。
我们得到了一个带有 Ribbon 设计器的 WordAddin 项目。
向 Ribbon 组件添加两个 Button 对象,然后将 Ribbon 上的 Tab1 对象的 ‘ControlIDType’ 属性值修改为 ‘Custom’。
双击两个已添加的 Ribbon Button 对象;将显示以下代码窗口。
5.4 准备 xtml 文件;
将源代码中提供的两个 xtml 文件(desktop.xtml 和 desktop4.xtml)(位于子目录“Tangram\xtml”中)复制到 ‘c:\’。当然,您也可以将它们放置到您指定的其他目录中。有关 xtml 文件的详细信息,请参阅本文中的Tangram Extension Tools for Application 概述部分。
5.5 修改 Ribbon1 类
将 Ribbon1 类的源代码修改如下
Public Class Ribbon1 Dim RibbonNavigator As NewTangramNavigator Private Sub Ribbon1_Load(ByVal sender As System.Object, ByVal e As RibbonUIEventArgs) Handles MyBase.Load RibbonNavigator.SetMainClientID("_Wwf") End Sub Private Sub Ribbon1_Close(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Close RibbonNavigator.Release() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click Dim xObj AsTangramDocObj xObj = RibbonNavigator.NavigateXTML(0, "c:\desktop.xtml", True) End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button2.Click Dim xObj AsTangramDocObj xObj = RibbonNavigator.NavigateXTML(0, "c:\desktop4.xtml", True) End Sub End Class
我们可以对以上代码给出更详细的解释。首先需要注意的是,'RibbonNavigator' 对象是 TangramCommonExtender 程序集公开的 .NET 类 'TangramNavigator' 的一个实例,它实现了如何将一个扩展的软件框架加载到目标软件系统中。该对象包含两个方法,第一个是“SetMainClientID”,它接受一个字符串参数,用于标识主框架窗口的客户区窗口的‘窗口类名’。对于一个通用的 MDI 窗口,这个字符串的值是“MDIClient”。对于常见的 MS Office 软件,这个值是
1. MS Word 的“_Wwf”;
2. Excel 的“XLDesk”;
3. Outlook 原始主框架的“Rctrl_renwnd32”;
4. Outlook 其他主框架的“AfxWndW”;
通常,我们可以使用 Visual Studio 附带的 Spy++ 工具来获取特定Windows 窗口的这个字符串值。第二个方法是‘NavigateXTML’,它接受三个参数。以下是这些参数的描述
1. 第一个参数用于标识主框架窗口的句柄。如果此参数为零,将找到并选择默认的活动主框架作为指定的主框架窗体;
2. 第二个参数是 xtml 文件路径。有关 xtml 文件的详细信息,请参阅本文中的Tangram Extension Tools For Application 概述部分;
3. 第三个参数是 BOOL 类型。如果 Tangram Extension Tools 应用的工作目标是特定的桌面软件系统,则此参数的值为 true;如果您的工作目标是“Windows 桌面”,则为 false。
方法‘NavigateXTML’完成了新客户区重建的任务。如果 NavigateXTML 加载的 xtml 文件包含一个名为“TangramMDIView”的节点,则先前的客户区窗口将被放置到与该节点对应的 UI 位置。其他空闲位置将填充新的 UI 元素,在本示例中是 .NET WinForms。一个主框架可以包含多个扩展的 UI 框架;根据您的需要,填充到每个扩展框架中的对象可能是不同的元素。第二个需要注意的事项是由 TangramCommonExtender 程序集公开的 .NET 对象“TangramDocObj”,当通过 ‘TangramNavigator’ 的实例使用其 NavigateXTML 方法加载 xtml 文件时,我们获得了一个“TangramDocObj”对象实例,“TangramDocObj”的更多详细信息将在稍后讨论。
编译并运行;结果是

点击第一个 Ribbon 按钮

点击第二个 Ribbon 按钮;结果是

5.6 将一个 .NET WinForm 对象放置到 Word 2007 的客户区
现在,我们向此项目添加一个新的 WinForm 对象“Form1”。

将 Ribbon 对象中 Button1 的 Click 事件代码修改如下
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click Dim xObj AsTangramDocObj xObj = RibbonNavigator.NavigateXTML(0, "c:\desktop.xtml", True) If xObj.ObjectInstalled("MicrosoftWord_S0001") = False Then Dim xForm As New Form1 xObj.SetWnd(xForm, "MicrosoftWord_S0001") xForm.Show() End If End Sub
其中,一个关键对象是“TangramDocObj”,每个 xtml 文件对应一个“TangramDocObj”对象。开发人员通过一个“TangramNavigator”对象实例导航一个 xtml 文件以获得一个“TangramDocObj”对象实例,.NET 对象“TangramDocObj”包含两个方法和两个属性。下面描述“TangramDocObj”对象的方法
1. ObjectInstalled,用于检测指定的空闲空间是否已填充 .NET WinForm 对象。其参数是一个字符串,即空闲空间的名称(通过在‘空闲空间’上双击鼠标左键可以将此值复制到剪贴板);
2. SetWnd,接受两个参数。第一个是用于指定一个空闲空间视图的字符串(即相应‘空闲空间’的名称);第二个是用于放置到指定空间的 WinForm 对象。
一旦 Tangram Extension Tools for Application 检测到一个空间未被填充,它将通过“SetWnd”方法将一个 WinForm 对象放置到指定位置。
编译并点击 Ribbon 对象上的第一个按钮后,结果是

如果新重建的 UI 框架中有空闲空间,我们可以添加多个 Form 对象。
5.7 处理 Form1 对象上对话框的消息
通常,上述 Form1 对象不能正确处理对话框的常规消息,尤其是 Tab 键消息。因此,我们需要将 Form1 对象的基类修改为“TangramForm”。
下面显示了修改过程
1. 打开文件 Form1.Designer.vb 并找到以下代码。
Partial Class Form1
Inherits System.Windows.Forms.Form
2. 将 Inherits System.Windows.Forms.Form 替换为 Inherits TangramForm。
3. 将 Ribbon 上 Button1 的 Click 事件代码修改如下
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button1.Click Dim xObj As TangramDocObj xObj = RibbonNavigator.NavigateXTML(0, "c:\desktop.xtml", True) If xObj.ObjectInstalled("MicrosoftWord_S0001") = False Then Dim xForm As New Form1 xForm.TangramDoc = xObj xObj.SetWnd(xForm, "MicrosoftWord_S0001") xForm.Show() End If End Sub
这样,Form1 对象就可以正确处理对话框的消息了。有关详细代码,请参见 TangramCommonExtender 项目中“TangramForm”类的实现。
5.8 Office 2007 的其他应用
在上述示例中,我们以 Word 2007 为例,向您展示了如何使用 Tangram Extension Tools for Application 开发项目。对于其他应用系统,尤其是 Office 系列软件,开发方法类似,此处不打算一一赘述。感兴趣的开发人员可以参考其他提供的示例。
6. Tangram Extension Tools for Application 概述
TangramDeskManager 项目基于 MFC/ATL 类库,并包含以下关键部分
1. 一个基于 XML 技术的 UI 框架脚本引擎;
2. 两个用于 Internet Explorer 的异步可插拔协议;
3. 一个 ActiveX 控件:TangramWebCtrl。
6.1 一个基于 XML 技术的 UI 框架描述引擎
当您想重建某个软件系统的客户区时,首先必须确保原始客户区的功能不被破坏,并应将其视为一个独立的功能单元。我们必须意识到,在重建客户区空间时,扩展框架的结构可能会根据需求而变化。这意味着需要一个具有普遍性的通用解决方案。通常,扩展框架的复杂性取决于实现技术和开发语言,甚至在一定程度上取决于开发人员的能力。为了能够普遍解决这个问题并避免因技术差异带来的困难,Tangram 框架利用了 XML 技术。基于 XML 技术的 UI 框架描述引擎就是这种思想的产物。通常,当一个矩形窗口用作用户区域时,其中的基础 UI 框架可以分为两种结构,一种是“拆分器结构”,其中用户区域似乎被“拆分条”分成了几个子区域;另一种是“选项卡窗口”结构,通常被称为选项卡式窗口,这与拆分器不同。在选项卡窗口结构中,一组用户区域会重叠,不可见的用户区域会用一个选项卡来表示。一个普通的用户区域可能同时包含上述两种结构。通常,一个选项卡窗口结构可以用各种选项卡样式来呈现。然而,在 Tangram Extension Tools for Application 中只提供了几种简单的选项卡样式。以下是一个 UI 框架的示例

通常,用特定代码实现上述 UI 是很困难的。在 Tangram Extension Tools for Application 中,此 UI 结构是使用 XML 实现的,如下所示
<Window> <TangramNode Name="VBDoc" ID="tangramtabwnd" Width="771" Style="1" ActivePage="0"> <Pages> <TangramNode Name="VBDoc_Tab00" Caption="TabPage1" ID="tangramsplitter" Width="762" > <Row> <TangramNode Name="VBDoc_Tab00_S0000" ID="TangramDesignView" Width="175" Height="590"/> <TangramNode Name="VBDoc_Tab00_S0001" ID="tangramsplitter" Width="761" Height="590"/> <Row> <TangramNode Name="VBDoc_Tab00_S0001_S0000" ID="tangramexceltabwnd" Width="761" Style="0" ActivePage="0" Height="388"/> <Pages> <TangramNode Name="VBDoc_Tab00_S0001_S0000_Tab00" Caption="ExcelPage1" ID="tangrammdiview" Width="761" Height="371"/> <TangramNode Name="VBDoc_Tab00_S0001_S0000_Tab01" Caption="ExcelPage2" ID="TangramDesignView" Width="603"/> </Pages> </TangramNode> </Row> <Row> <TangramNode Name="VBDoc_Tab00_S0001_S0100" ID="TangramDesignView" Width="761" Height="195"/> </Row> </TangramNode> </Row> </TangramNode> <TangramNode Name="VBDoc_Tab01" Caption="TabPage2" ID="tangramsplitter" Width="762" > <Row> <TangramNode Name="VBDoc_Tab01_S0000" ID="TangramDesignView" Width="257" /> <TangramNode Name="VBDoc_Tab01_S0001" ID="tangramoutlookview" Width="494" ActivePage="0"> <Pages> <TangramNode Name="VBDoc_Tab01_S0001_Tab00" Caption="OutLookPane" ID="TangramDesignView" Width="494" /> <TangramNode Name="VBDoc_Tab01_S0001_Tab01" Caption="OutLookPane1" ID="TangramDesignView" Width="494" /> </Pages> </TangramNode> </Row> </TangramNode> </Pages> </TangramNode> </Window>
通过使用 XML 描述,我们可以避免大量的编码工作,并实现一个一致的 UI 描述模式。然而,当 UI 框架变得复杂时,编写 XML 文件将成为一个新的问题和困难,TangramDeskManager 的关键目的之一就是将上述 XML 描述呈现为软件 UI 结构,并实现 XML 框架的可视化设计器。
像上面这样的 XML 文件被称为 xtml 文件,每个文件对应一个可定制的 UI 结构。Tangram 系统的基本思想之一是:开发人员设计 xtml 文件,然后将对象,如 .NET 控件/窗体、MFC 视图或 ActiveX 控件等,放置到用指定名称标识的空间中。具体过程是:当开发人员选择目标系统中的客户区时,他会假设这个客户区是可移动的,然后对其进行重建。这样,以前被原始客户区垄断的区域就被重建了。在此期间,开发人员可以使用上面描述的拆分器、选项卡窗口等结构来重建这个目标区域。重建后,原始客户区将占据新框架中的一个指定空间(注意,在重建之前它完全垄断了目标区域),新生成的空间将填充新的 UI 元素。Tangram Extension Tools for Application 的主要职责之一是为编写 xtml 文件提供可视化设计器。
6.2 两个异步可插拔协议和 xtml 文件的可视化设计
Tangram Extension Tools 的最初目标之一是 Internet Explorer。通过使用这个工具,开发人员可以自由地设计 IE Band 对象,并自由地定制其客户区结构。每个 xtml 文件都可以呈现为一个特定的 IE Band 对象(取决于加载模式)。
XTML 可视化设计器是作为 IE 的一个异步可插拔协议实现的。MFC/ATL 开发人员可以参考 CTangramCMD 类的详细实现。通过在 IE 地址栏中使用 URL“ie:dc”,开发人员可以激活可视化设计器

按下按钮 NewXTML,将显示一个特定的设计页面,如下所示

其中,上下文菜单通过右键点击鼠标激活。可视化设计器的目的是提供一个统一的设计场景。菜单项“Host Client…”用于指定目标软件客户区的位置。通过这个可视化设计器,开发人员可以设计一个空的 UI 框架,这个框架的空闲空间将在软件设计期间填充 .NET WinForms,双击一个空闲空间,它的名称将被获取(复制到剪贴板)。然后,开发人员可以通过“TangramDocObj”对象使用这个名称将一个 .NET WinForm 对象绑定到这个空闲空间。
TangramDeskManager 中包含的另一个异步可插拔协议用于加载 xtml 文件。如果目标软件是 Internet Explorer,一个 xtml 文件可以被加载到以下 3 个位置
1. 左侧的资源管理器栏;
2. 底部的通讯栏;
3. IE 的客户区;
URL 语法是
xtml://xtml 文件路径?target = x 其中,x 可能是 l、b 或 c。
例如,URL “xtml://c:\desktop.xtml?target=c” 可以呈现如下

6.3 TangramDeskManager 中的 ActiveX 控件 TangramWebCtrl
我们在此不详细介绍这个控件。另一篇文章将提供更多关于其应用的信息。
7. 关于 Xtml 文件和 Office 开发的进一步讨论
既然您已经使用 Tangram Extension Tools for Application 编写并探索了您的第一个 Office 扩展应用程序,让我们进一步讨论这个问题。一旦目标软件中客户区的框架可以用 xtml 文件来呈现,目标软件将演变成另一种浏览 xtml 文件的浏览器。目标软件可能不仅仅是 MS Office,它也可以是支持插件技术的其他应用程序系统。与普通浏览器不同,像 Office 这样的目标软件是为带有 UI 框架的富客户端元素设计的,而不是普通的 html 文件。例如,通过浏览一个 xtml 文件,Outlook 联系人模块可以扩展如下

在 Outlook 中创建联系人时,只能呈现有限的信息。使用 xtml 描述技术,您可以轻松地在该联系人上呈现更多有用的信息,例如他/她的业绩、简历等,而这些大部分是 Outlook 没有考虑到的。Excel 是企业最常用的软件系统之一,可用于处理许多问题,如海量数据分析、报表和财务会计等。事实上,如果企业信息系统的主界面能直接构建到 Microsoft Excel 中,许多问题都能在 Excel 中得到有效解决。然而,桌面 UI 结构如此之多且丰富,它们能被加载到 Excel 中吗?使用 Tangram Extension Tools for Application,您可以将 Excel 用作一个浏览器来浏览富客户端页面。因此,许多企业应用模型可以直接托管到 Excel 框架中。

(Excel 的新扩展框架,这使得 Excel 变成了一个富客户端框架。)
如果一些复杂的 UI 结构可以表示为 xtml 文件,那么那些可以被视为上述目标软件的软件将变成一个高度可定制的应用程序浏览器(浏览 xtml 文件就像 Internet Explorer 浏览 html 文件一样),这是提高软件可重用性并为像 MS Office 这样的应用软件提供新的扩展方法的新途径。