摘要
在 Microsoft Visual Basic 中使用 New 运算符或 CreateObject 函数创建 Microsoft Office 应用程序的实例时,可能会收到以下错误消息:
运行时错误“429”:ActiveX 组件无法创建对象
当组件对象模型 (COM) 无法创建请求的自动化对象,并且自动化对象因此对 Visual Basic 不可用时,会发生此错误。 并非所有计算机上都会出现此错误。
本文介绍如何诊断和解决可能导致此错误的常见问题。
更多信息
在 Visual Basic 中,错误 429 有多种原因。 如果满足以下任一条件,则会发生此错误:
-
应用程序中存在错误。
-
系统配置中存在错误。
-
缺少组件。
-
存在损坏的组件。
若要查找错误的原因,请隔离问题。 如果在客户端计算机上收到“429”错误消息,请使用以下信息来隔离并解决 Microsoft Office 应用程序中的错误。
注意 以下部分信息可能也适用于非 Office COM 服务器。 但是,本文假定你想要自动执行 Office 应用程序。
检查代码
在排查错误之前,请尝试隔离可能导致问题的单行代码。
如果发现单行代码可能导致问题,请完成以下过程:
-
确保代码使用显式对象创建。
问题是否缩小到单个操作更容易识别。 例如,查找用作以下其中一项的隐式对象创建。
代码示例 1Application.Documents.Add 'DON'T USE THIS!!
代码示例 2
Dim oWordApp As New Word.Application 'DON'T USE THIS!! '... some other code oWordApp.Documents.Add
这两个代码示例都使用隐式对象创建。 在至少调用一次变量之前,Microsoft Office Word 2003 不会启动。 由于变量可能在程序的不同部分调用,因此问题可能难以找到。 在创建 Application 对象或创建 Document 对象时,可能很难验证是否导致了该问题。
相反,可以进行显式调用以单独创建每个对象,如下所示。Dim oWordApp As Word.Application Dim oDoc As Word.Document Set oWordApp = CreateObject("Word.Application") '... some other code Set oDoc = oWordApp.Documents.Add
进行显式调用以单独创建每个对象时,问题更易于隔离。 这也可能会使代码更易于阅读。
-
创建 Office 应用程序的实例时,请使用 CreateObject 函数而不是 New 运算符。
CreateObject 函数密切映射大多数Microsoft Visual C++客户端使用的创建过程。 CreateObject 函数还允许在各版本之间更改服务器的 CLSID。 可以将 CreateObject 函数用于早期绑定对象和后期绑定对象。 -
验证传递给
CreateObject 的“ProgID”字符串是否正确,然后验证“ProgID”字符串是否与版本无关。 例如,使用“Excel.Application”字符串,而不是使用“Excel.Application.8”字符串。 发生故障的系统可能具有较旧版本的 Microsoft Office 或较新版本的 Microsoft Office,而不是在“ProgID”字符串中指定的版本。 -
使用 Erl 命令报告不成功的代码行号。 这可能有助于调试无法在 IDE 中运行的应用程序。 以下代码告知无法 (Microsoft Word 或 Microsoft Office Excel 2003) 创建哪个自动化 对象:
Dim oWord As Word.Application Dim oExcel As Excel.Application On Error Goto err_handler 1: Set oWord = CreateObject("Word.Application") 2: Set oExcel = CreateObject("Excel.Application") ' ... some other code err_handler: MsgBox "The code failed at line " & Erl, vbCritical
使用 MsgBox 函数和行号跟踪错误。
-
按如下所示使用后期绑定:
Dim oWordApp As Object
早期绑定对象需要跨进程边界封送其自定义接口。 如果在 CreateObject 期间或 新建期间无法封送自定义接口,则会收到“429”错误消息。 后期绑定对象使用 IDispatch 系统定义的接口,该接口不需要封送自定义代理。 使用后期绑定对象验证此过程是否正常工作。
如果仅在早期绑定对象时出现问题,则问题出在服务器应用程序中。 通常,可以重新安装应用程序,如本文的“检查自动化服务器”部分中所述,以更正问题。
检查自动化服务器
使用 CreateObject 或 New 时发生错误的最常见原因是影响服务器应用程序的问题。 通常,应用程序的配置或应用程序的设置会导致此问题。 若要进行故障排除,请使用以下方法:
-
验证要自动化的 Office 应用程序是否已安装在本地计算机上。 请确保可以运行应用程序。 为此,请单击“开始”,单击“运行”
,然后尝试运行该应用程序。 如果无法手动运行应用程序,则应用程序将无法通过自动化运行。 -
重新注册应用程序,如下所示:
-
单击 “开始”,然后单击“运行”。
-
在“ 运行 ”对话框中,键入服务器的路径,然后将 /RegServer 追加到行的末尾。
-
单击“确定”。
应用程序以无提示方式运行。 应用程序重新注册为 COM 服务器。
如果由于缺少注册表项而出现问题,则这些步骤通常会更正问题。
-
-
检查要自动化的应用程序的 CLSID 下的 LocalServer32 键。 确保 LocalServer32 键指向应用程序的正确位置。 确保路径名称采用短路径 (DOS 8.3) 格式。 无需使用短路径名称注册服务器。 但是,包含嵌入空间的长路径名称可能会导致某些系统上出现问题。
若要检查为服务器存储的路径键,请启动 Windows 注册表编辑器,如下所示:-
单击 “开始”,然后单击“运行”。
-
键入 regedit,然后单击“确定”。
-
移动到HKEY_CLASSES_ROOT\CLSID键。
系统上已注册的自动化服务器的 CLSID 在此密钥下。 -
使用以下 CLSID 密钥值查找表示要自动化的 Office 应用程序的密钥。 检查路径的 CLSID 密钥的 LocalServer32 键。
Office 服务器
CLSID 密钥
Access.Application
{73A4C9C1-D68D-11D0-98BF-00A0C90DC8D9}
Excel.Application
{00024500-0000-0000-C000-00000000046}
Outlook.Application
{0006F03A-0000-0000-C000-00000000046}
PowerPoint.Application
{91493441-5A91-11CF-8700-00AA0060263B}
Word.Application
{000209FF-0000-0000-C000-00000000046}
-
检查路径以确保它与文件的实际位置匹配。
备注 短路径名称在不正确时可能看起来正确。 例如,如果 Office 和 Microsoft Internet Explorer 安装在默认位置) 具有类似于 C:\PROGRA~1\MICROS~X\ ((其中
X 是数字) )的短路径,则 Office 和 Microsoft Internet Explorer (。 此名称最初可能不会显示为短路径名称。
若要确定路径是否正确,请执行以下步骤:-
单击 “开始”,然后单击“运行”。
-
复制注册表中的值,然后将该值粘贴到“ 运行 ”对话框中。
注意 在运行应用程序之前,请删除 /automation 开关。 -
单击“确定”。
-
验证应用程序是否正确运行。
如果应用程序在单击“ 确定”后运行,则服务器已正确注册。 如果应用程序在单击“确定”后未运行,请将 LocalServer32 键的值替换为正确的路径。 如果可以,请使用短路径名称。
-
-
测试 Normal.dot 模板或 Excel.xlb 资源文件的可能损坏。 如果 Word 中的 Normal.dot 模板或 Excel 中的 Excel.xlb 资源文件损坏,则自动执行 Microsoft Word 或 Microsoft Excel 时可能会出现问题。 若要测试这些文件,请在本地硬盘中搜索 Normal.dot 或 Excel.xlb 的所有实例。
注意 你可能会找到这些文件的多个副本。 对于安装在系统上的每个用户配置文件,每个文件都有一个副本。
暂时重命名 Normal.dot 文件或 Excel.xlb 文件,然后重新运行自动化测试。 Word 和 Excel 如果找不到这些文件,它们将创建这些文件。 验证代码是否正常工作。 如果代码在创建新的 Normal.dot 文件时有效,请删除重命名的文件。 这些文件已损坏。 如果代码不起作用,则必须将这些文件还原为其原始文件名,以保存这些文件中保存的任何自定义设置。 -
在管理员帐户下运行应用程序。 Office 服务器需要对注册表和磁盘驱动器具有读/写访问权限。 如果当前安全设置拒绝读取/写入访问权限,Office 服务器可能无法正常加载。
检查系统
系统配置还可能导致创建进程外 COM 服务器时出现问题。 若要进行故障排除,请在发生错误的系统上使用以下方法:
-
确定问题是否发生在任何进程外服务器。 如果你有使用特定 COM 服务器 ((如 Word) )的应用程序,请测试其他进程外服务器,以确保 COM 层本身不会出现问题。 如果无法在计算机上创建进程外 COM 服务器,请按照本文的“重新安装 Microsoft Office”部分中所述重新安装 OLE 系统文件,或重新安装操作系统以解决此问题。
-
检查管理自动化的 OLE 系统文件的版本号。 这些文件通常作为一组安装。 这些文件必须与内部版本号匹配。 错误配置的安装程序实用工具可能会错误地单独安装文件。 这会导致文件不匹配。 若要避免自动化问题,请检查文件以确保文件内部版本匹配。
自动化文件位于 Windows\System32 目录中。 检查以下文件。File name
版本
修改日期
Asycfilt.dll
10.0.16299.15
2017 年 9 月 29 日
Ole32.dll
10.0.16299.371
2018 年 3 月 29 日
Oleaut32.dll
10.0.16299.431
2018 年 5 月 3 日
Olepro32.dll
10.0.16299.15
2017 年 9 月 29 日
Stdole2.tlb
3.0.5014
2017 年 9 月 29 日
若要检查文件版本,请在 Windows 资源管理器中右键单击该文件,然后单击“ 属性”。 请注意文件版本的最后四位数字 (内部版本号) 以及上次修改文件的日期。 请确保这些值对于所有自动化文件都是相同的。
注意以下文件适用于Windows 10版本 1709 内部版本 16299.431。 这些数字和日期只是示例。 值可能不同。 -
使用系统配置实用工具 (Msconfig.exe) 检查可能限制 Office 应用程序中
运行代码的第三方应用程序的服务和系统启动注意 仅在未连接到网络的测试系统上暂时禁用防病毒程序。
或者,在 Outlook 中按照以下步骤禁用第三方加载项:
如果此方法解决了问题,请联系第三方防病毒供应商,了解有关防病毒程序更新的详细信息。-
在“ 文件”菜单上,单击“ 选项”,然后单击“ 加载项”。
-
单击“ 管理 COM 加载项”,然后单击“ 转到”。
注意此时会打开 “COM 加载项”对话框。 -
清除任何第三方加载项的复选框,然后单击“ 确定”。
-
重启 Outlook。
-
重新安装 Office
如果上述过程均未解决问题,请删除并重新安装 Office。
有关详细信息,请参阅以下 Office 文章:
参考
有关 Office 自动化和代码示例的详细信息,请转到以下 Microsoft 网站: