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 始终保持运行状态。