本文分步介绍如何创建一个 Microsoft Visual C# 2005年或 Microsoft Visual C#.net 客户端获取到 Office 程序的运行实例的自动化参考的。
如果自动化服务器会在运行对象表中注册其自身,.net 客户端可以通过调用以下获得对运行实例的引用:
当新的 COM 对象的请求到达 Multiuse (鍗曞疄) COM 服务器时,服务器将用来创建该对象的.exe 文件只有一个实例。 无论多少客户端请求一个新的 COM 对象,将只有一个服务器.exe 进程。 在单一的使用 (多实例) 服务器中为新的 COM 对象的每个请求启动服务器.exe 文件的单独实例。 因此,该服务器的多个实例可以在同一台计算机上运行。
可以同时运行多个 Word (Winword.exe)、 Excel (Excel.exe) 和 Microsoft Access (MSAccess.exe) 实例。 因此,这些服务器定义为单个使用 (多实例) 服务器。 在任何给定时间运行的 PowerPoint (Powerpnt.exe) 只有一个实例。 因此,PowerPoint 是 Multiuse (鍗曞疄) 服务器。
COM 服务器是否是单一的使用 (多实例) 或 Multiuse (鍗曞疄) 可能会影响您的决定使用 GetActiveObject 获取对该服务器的引用。 因为可以运行的 Word、 Excel,或 Microsoft Access 的潜在多个实例 GetActiveObject 特定服务器上可能会返回确实不期望的实例。 第一次注册到 ROT 中该实例通常是由 GetActiveObject 返回该实例。 如果想获得一个自动化引用到正在运行一个特定的 Word 实例 Excel,或 Microsoft Access 在该实例中打开该文件的名称与使用 BindToMoniker。 对于 PowerPoint 像一个 Multiuse (鍗曞疄) 服务器不重要,因为自动化引用指向相同的运行实例。
COM 服务器应为启动后运行对象表中注册自己。 office 程序进行自我注册时它们会丢失焦点。 如果某个程序试图将附加到正在运行的实例,该程序失去焦点之前,您可能会收到一条错误消息。 有关如何解决此问题的其他信息,请单击下面文章编号,查看 Microsoft 知识库中相应的文章:
创建 Visual C# 2005年或应用 Visual C#.net 程序,可运行实例,Office 程序的自动化
自动执行 Office 的客户端程序可以创建一个新的 Office 程序实例或获取对已在运行该实例的引用。 Microsoft 通常建议您创建一个新的实例,而不是附加到正在运行的实例。 然而,在某些方案中客户端程序必须自动的 Office 程序已经运行的实例。 在本例中自动化客户端获取该自动化参考服务器的组件对象模型 (COM) 对象从运行对象表 (ROT)。如果自动化服务器会在运行对象表中注册其自身,.net 客户端可以通过调用以下获得对运行实例的引用:
System.Runtime.InteropServices.Marshal.GetActiveObject
-或者-
System.Runtime.InteropServices.Marshal.BindToMoniker
-或者-
System.Runtime.InteropServices.Marshal.BindToMoniker
示例代码
- 启动 Microsoft Visual Studio 2005 或 Microsoft Visual Studio.net。 在 文件 菜单上单击 新建,然后单击 项目。 在 项目类型,下单击 Visual C# 项目,然后,模板,下单击 Windows 应用程序。 默认情况下创建 Form1。
注意 在 Visual C# 2005,单击 Visual C# 而不是 Visual C# 项目。 - 添加对 Microsoft Excel 对象库 和 Microsoft Word 对象库 的引用。 若要执行此操作,请按照下列步骤操作:
- 在 项目 菜单上单击 添加引用。
- 在 COM 选项卡上找到 Microsoft Excel 对象库,然后单击 全。
注意 在 Visual C# 2005 中, 没有单击 选择。
注意 Microsoft Office 2003 包括主互操作程序集 (pia)。 Microsoft Office XP 不包括 pia,但它们可能会被下载。 对于 Office XP pia 有关的其他信息,请单击下面文章编号,查看 Microsoft 知识库中相应的文章:328912 (http://support.microsoft.com/kb/328912/EN-US/ ) 信息: Microsoft Office XP pia 可用于下载 - 找到该 Microsoft Word 对象库,然后单击 选择。
注意 在 Visual C# 2005 中, 没有单击 选择。 - 在 添加引用 对话框中单击 确定 以接受您的选择。
- 在 视图 菜单上单击 工具箱 以显示工具箱。 向 Form1 中添加三个按钮和文本框。 键入这些控件的文本,如下所示:
ID Text -------- --------- button1 Get Automation Reference to running Instance of Excel button2 Get Automation Reference to Excel using File Moniker button3 Shell Word and Get Automation Reference to it textBox1 Enter the filename for the saved xls file
- 设置按钮控件的 Click 事件处理向上,如下所示:
- 双击 button1,然后单击 视图 菜单上的 设计器。
- 双击 button2,然后单击 视图 菜单上的 设计器。
- 双击 button3。
- 其他 using 语句后 Form1.cs 的顶部添加以下代码:
using Excel = Microsoft.Office.Interop.Excel; using Word = Microsoft.Office.Interop.Word;
- 下面的代码添加到事件处理程序:
private void button1_Click(object sender, System.EventArgs e) { //Excel Application Object Excel.Application oExcelApp; this.Activate(); //Get reference to Excel.Application from the ROT. oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); //Display the name of the object. MessageBox.Show(oExcelApp.ActiveWorkbook.Name); //Release the reference. oExcelApp = null; } private void button2_Click(object sender, System.EventArgs e) { Excel.Workbook xlwkbook; Excel.Worksheet xlsheet; //Get a reference to the Workbook object by using a file moniker. //The xls was saved earlier with this file name. xlwkbook = (Excel.Workbook) System.Runtime.InteropServices.Marshal.BindToMoniker(textBox1.Text); string sFile = textBox1.Text.Substring(textBox1.Text.LastIndexOf("\\")+1); xlwkbook.Application.Windows[sFile].Visible = true; xlwkbook.Application.Visible = true; xlsheet = (Excel.Worksheet) xlwkbook.ActiveSheet; xlsheet.Visible = Excel.XlSheetVisibility.xlSheetVisible; xlsheet.Cells[1,1] = 100; //Release the reference. xlwkbook = null; xlsheet = null; } private void button3_Click(object sender, System.EventArgs e) { Word.Application wdapp; //Shell Word System.Diagnostics.Process.Start("<Path to WINWORD.EXE>"); this.Activate(); //Word and other Office applications register themselves in //ROT when their top-level window loses focus. Having a MessageBox //forces Word to lose focus and then register itself in the ROT. MessageBox.Show("Launched Word"); //Get the reference to Word.Application from the ROT. wdapp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application"); //Display the name. MessageBox.Show(wdapp.Name); //Release the reference. wdapp = null; }
- 在 生成 菜单上选择 生成解决方案 以生成应用程序。
测试应用程序
- 按 F5 生成并运行您的应用程序。
- 关闭所有正在运行的 Excel 的实例。
- 启动一个新的工作簿的 Excel。
- 单击 要运行的 Excel 实例获取自动化参考 按钮。
- 应用程序获取自动化引用现有的 Excel 实例。 自动化引用存储在用于 button1_Click 的该本地变量 oExcelApp。 消息框显示活动工作簿的名称。
- 将工作簿保存到本地磁盘上。 使工作簿保持打开状态,在 Excel 中。
- 键入在 textBox1 中上一步中保存的工作簿的完整的路径和文件名。
- 单击 获取到使用文件名字对象的 Excel 的自动化参考 按钮。
- 应用程序获取正在运行的 Excel 实例的自动化引用。 自动化参考存储在用于 button2_Click 的该本地变量 xlwkbook。 第一行和活动工作表的第一列中输入了值为 100。
- 不保存工作簿所做更改的情况下退出 Excel。
- 单击 获取到使用文件名字对象的 Excel 的自动化参考 按钮。
- 在创建新的 Excel 实例,并在打开以前保存的工作簿。 应用程序获取此实例的 Excel 的自动化引用。 自动化参考存储在用于 button2_Click 的该本地变量 xlwkbook。 第一行和活动工作表的第一列中输入了值为 100。
- 关闭 Excel。
- 单击 Shell Word 并获取对它的自动化参考 按钮。
- Word 启动,就像从命令提示符中启动并显示 已启动 Word 消息框。 显示一个消息框会强制 WM_SETFOCUS 消息发送到 Word 程序窗口。 这样,Word 将自己注册为在运行对象表 (ROT)。
- 关闭消息框。 一个自动化的新启动的 Word 实例来引用该程序获取。 自动化引用存储在用于 button3_Click 的该本地变量 wdapp。 显示一个消息框,显示了 Word.Application 对象的名称。
其他说明
COM 服务器可以分为 Multiuse (鍗曞疄) 或单一使用 (多实例),具体取决于该服务器可以在一台计算机同时运行的实例数。当新的 COM 对象的请求到达 Multiuse (鍗曞疄) COM 服务器时,服务器将用来创建该对象的.exe 文件只有一个实例。 无论多少客户端请求一个新的 COM 对象,将只有一个服务器.exe 进程。 在单一的使用 (多实例) 服务器中为新的 COM 对象的每个请求启动服务器.exe 文件的单独实例。 因此,该服务器的多个实例可以在同一台计算机上运行。
可以同时运行多个 Word (Winword.exe)、 Excel (Excel.exe) 和 Microsoft Access (MSAccess.exe) 实例。 因此,这些服务器定义为单个使用 (多实例) 服务器。 在任何给定时间运行的 PowerPoint (Powerpnt.exe) 只有一个实例。 因此,PowerPoint 是 Multiuse (鍗曞疄) 服务器。
COM 服务器是否是单一的使用 (多实例) 或 Multiuse (鍗曞疄) 可能会影响您的决定使用 GetActiveObject 获取对该服务器的引用。 因为可以运行的 Word、 Excel,或 Microsoft Access 的潜在多个实例 GetActiveObject 特定服务器上可能会返回确实不期望的实例。 第一次注册到 ROT 中该实例通常是由 GetActiveObject 返回该实例。 如果想获得一个自动化引用到正在运行一个特定的 Word 实例 Excel,或 Microsoft Access 在该实例中打开该文件的名称与使用 BindToMoniker。 对于 PowerPoint 像一个 Multiuse (鍗曞疄) 服务器不重要,因为自动化引用指向相同的运行实例。
COM 服务器应为启动后运行对象表中注册自己。 office 程序进行自我注册时它们会丢失焦点。 如果某个程序试图将附加到正在运行的实例,该程序失去焦点之前,您可能会收到一条错误消息。 有关如何解决此问题的其他信息,请单击下面文章编号,查看 Microsoft 知识库中相应的文章:
316125 (http://support.microsoft.com/kb/316125/EN-US/ ) PRB: Visual C#.net 错误附加到运行 Office 应用程序的实例
引用
有关在不同的其他信息行为的 Office 程序时使用 GetActiveObject,请单击下面文章编号,查看 Microsoft 知识库中相应的文章:288902 (http://support.microsoft.com/kb/288902/EN-US/ ) 信息: GetObject 和 Office 自动化服务器 CreateObject 行为