Office 自动化服务器的 GetObject 和 CreateObject 行为

摘要

本文讨论将 GetObject 和 CreateObject 函数用于各种版本的 Microsoft Office 应用程序时发生的不同行为。

GetObject 和 CreateObject 是由 Microsoft Visual Basic 和 Microsoft Visual Basic for Applications (VBA) 提供的函数。 但是,如果将对 GetObject 的引用视为对 GetActiveObject API 的调用,并将对 CreateObject 的引用视为对 CoCreateInstanceAPI 的调用,则此信息也适用于 Microsoft Visual C++。

更多信息

GetObject

GetObject 用于附加到正在运行的自动化服务器实例。 可通过几种不同的方法调用 GetObject,但建议用于 Microsoft Office 应用程序的语法如下所示:

set xlApp = GetObject(, "Excel.Application")

如果执行此代码时正在运行 Microsoft Excel 的实例,则可以通过 xlApp 变量访问正在运行的实例的对象模型。 如果没有实例正在运行,则会收到以下可捕获的运行时错误消息:

Run-time error '429':
ActiveX component can't create object  

如果多个 Microsoft Excel 实例正在运行,GetObject 会附加到首先启动的实例。 如果随后关闭第一个实例,则对 GetObject 的另一个调用会附加到已启动的第二个实例,依此类推。

如果知道该实例中打开的文档的名称,则可以附加到特定实例。 例如,如果 Excel 实例正在与名为 Book2 的打开工作簿一起运行,则以下代码会成功附加到该实例,即使它不是启动的最早实例:

Set xlApp = GetObject("Book2").Application

CreateObject

CreateObject 用于启动自动化服务器的新实例。 例如:

set xlApp = CreateObject("Excel.Application")

根据服务器是设计为 SingleUse 还是 MultiUse,可能会启动也可能不启动另一个服务器进程。 对于确定是否应强制关闭自动化实例,这可能是一个重要的区别。 例如,对于 MultiUse 服务器,如果实例在附加到它之前已在运行,则在完成自动化后,你可能希望避免以编程方式关闭服务器。

下表用作使用 Microsoft Office 实现解决方案的有用参考。 它列出了各种 Microsoft Office 版本和应用程序的行为和属性,例如服务器在启动时是否默认为可见,如果是 SingleUse 还是 MultiUse,如果服务器具有 UserControl 属性,如果服务器具有 Quit 方法,以及其main窗口的类名。

应用程序 () Visible 实例化 具有 UserControl 具有 QuitClassName 类名
Excel 97、2000、2002、2003、2007 SingleUse XlMain
Word 97、2000、2002、2003、2007 SingleUse OpusApp
PowerPoint 97 MultiUse PP97FrameClass
PowerPoint 2000 MultiUse PP9FrameClass
PowerPoint 2002 MultiUse PP10FrameClass
PowerPoint 2003 MultiUse PP11FrameClass
PowerPoint 2007 MultiUse PP12FrameClass
Access 97 SingleUse OMain
Access 2000、2002、2003、2007 SingleUse OMain
Project 98, 2000 MultiUse JWinproj-WhimperMainClass

当你想要方便地了解是否有任何实例正在运行时,main窗口类名称有助于调用 FindWindow API。 UserControl 属性是一个布尔属性,指示服务器应用程序在释放其最后一个引用时是否自动关闭, (设置为不) 。 在需要 (的情况下,Quit 方法允许重写 UserControl 属性,例如在释放最后一个引用后实例未关闭) 。

通常,Microsoft 建议使用 Office 应用程序的新实例,而不是附加到用户可能正在使用的实例。 最好使用 Application ProgID 创建实例,然后从那里打开或创建新对象。 其他 ProgID,例如 Excel.Sheet 和 Word。文档等适用于 OLE (对象链接和嵌入) ,并且与 CreateObject 一起使用时可能会提供不一致的结果。 通过使用 Application ProgID,可以通过显式启动自动化服务器来避免潜在问题 (而不是嵌入) 。

使用完自动化服务器后,释放对其的所有引用,并调用其 Quit 方法 ((如果可用) ),以便服务器按预期关闭。 如果要通过自动化配置实例,然后将其保留为打开状态供用户使用,则需要将 UserControl 属性设置为 TRUE,然后释放所有引用。 然后,服务器将保持运行 (,因为 UserControl 属性为 TRUE) ,并在用户关闭应用程序 (时适当关闭,因为) 没有未完成的引用。

注意对于Word,UserControl 属性为只读。 不能将其设置为 True 或 False。 释放最后一个引用时,Word始终保持运行状态。