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

总结

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

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

更多信息

GetObject

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

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

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

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

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

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

Set xlApp = GetObject("Book2").Application

CreateObject

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

set xlApp = CreateObject("Excel.Application")

根据服务器是设计为 SingleUse 还是 MultiUse,另一个服务器进程可能或可能不会启动。 这也许是决定是否应强行关闭自动化实例的重要区别。 例如,使用 MultiUse 服务器时,如果实例在附加到实例之前已在运行,则可能需要避免在自动执行该实例时以编程方式关闭服务器。

下表在实现具有Microsoft 办公室的解决方案时非常有用。 它列出了Microsoft 办公室的各种版本和应用程序的行为和属性,例如服务器在启动时是否默认可见;如果是 SingleUse 或 MultiUse,则其具有 UserControl 属性(如果有 Quit 方法)及其主窗口的类名称。

应用程序 Visible 实例化 Has UserControl Has 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

如果想要方便地找出任何实例正在运行,则主窗口类名称有助于调用 FindWindow API。 UserControl 属性是一个布尔属性,指示服务器应用程序在释放其上次引用时是否自动关闭(设置为无内容)。 Quit 方法允许在必要的情况下重写 UserControl 属性(例如,在释放上次引用后实例未关闭时)。

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

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

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