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始终保持运行状态。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈