BUG:自动化客户端在调用 Word 的 Find 对象时出现错误或崩溃

文章翻译 文章翻译
文章编号: 292744 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

当您所使用的进程外客户端应用程序使用早期绑定来使 Word 97 或更高版本自动运行时,该应用程序可能会由于存在访问冲突而崩溃,或者出现以下错误消息之一:

从 Microsoft Visual Basic 中
Run-time error '-2147023113 (800706f7)':
The method '~' of object '~' failed
Run-time error '-2147023113 (800706f7)':
Method 'Execute' of object 'Find' failed
Run-time error 430:
Class does not support automation or does not support expected interface.
从 Microsoft Visual C++ 中
HRESULT = 0x800706F7
RPC_X_BAD_STUB_DATA - The stub received bad data.
注意:在调试版本中,将会从“声明”对话框中收到堆栈损坏警告,并且 EAX 的值与上面列出的值相同。在发行版本中,堆栈损坏将可能在此后不久使该应用程序崩溃,但 HRESULT 值可能与上面的值类似。

该问题会在某些计算机上持续发生,但在另一些计算机上却可能永远不会发生。安装新的应用程序或 Microsoft Excel Service Pack 可能导致先前正常工作的计算机遇到该问题。

原因

Excel 5.0 版将 Word 用于其接口标识符的服务器全局唯一标识符 (GUID) 用于现在已弃用的较旧对象模型。

当 Excel 5.0 类型库在系统上重新注册时,注册表中应指向 Word 类型库的接口 GUID 将指向 Excel 5.0 库,并且 COM 可能会错误地使用早期 Word 绑定为进程外客户端构建错误的代理 v 表。由于此代理是为 Excel 的调度接口而不是为预期的 Word 接口配置的,因此对此代理进行的调用将返回错误或崩溃。

在 Excel 5.0 类型库以及 Word 8.0、8.1、10.0 和 11.0 类型库中复制了下列 GUID:


如果正确注册了 Word 类型库,则 COM 将正常构建正确的代理和进程外调用功能。

解决方案

要解决此问题,请执行下列操作之一:
  • 修改您的代码,在上面列出的任何 Word 接口上调用方法或属性时都使用晚期绑定。
    - 或 -

  • 在发生该问题的系统上重新注册 Word 类型库。
建议您使用晚期绑定解决方案。因为两种类型库均描述了实现 IDispatch 接口的接口,所以对任何 IDispatch 方法的调用都将有效,而与最后在系统上注册哪个类型库无关。这是确保您的代码不会在您未管理的系统上遇到此错误的唯一方法。

对于所使用的客户端应用程序无法重新编译为使用晚期绑定的客户,在大多数情况下,可以通过重新注册 Word 类型库来解决该问题。由于在再次重新注册 Excel 5.0 库时会重新出现该问题,因此这不是理想的解决办法。不过,由于重新注册 Excel 5.0 库的可能性很小,因此此方法对于大多数用户来说是可行的。

要重新注册 Word 类型库,请找到系统上安装的 Word 版本的相应类型库:


然后,在命令行中将 Regtlib.exe 与类型库的完整路径一起使用以向 COM 重新注册该库。Regtlib.exe 将在传入的类型库(.tlb 或 .olb)文件上调用 LoadTypeLibRegisterTypeLib 应用程序接口 (API)。COM 会修复错误配置的注册表项。

Regtlib.exe 包含在 Windows 库更新程序中。 有关库更新程序的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
197298 INFO:Microsoft 库更新:What, Where, Why

状态

Microsoft 已经确认这是本文开头列出的 Microsoft 产品中的错误。

更多信息

Excel 5.0 类型库 (Xl5en32.olb) 是为了向后兼容而提供的,并供在 Excel 97 之前编写的客户端使用。Excel 97 和更高版本的类型库与 Word 类型库之间不存在冲突。通常情况下不会注册 Excel 5.0 库,因此大多数客户端都不会遇到此问题。遇到此问题的客户端可能已安装了使用该库并在安装 Office 后进行注册的特定产品。

重现此问题的步骤

  1. 找到 Excel 5.0 类型库 (Xl5en32.olb),并通过在命令提示符处键入 Regtlib 来注册它。
  2. 在 Visual Basic 中,新建一个标准 EXE 项目。默认情况下会创建 Form1。
  3. 向 Form1 添加一个按钮,并将以下代码粘贴到 Form1 的代码部分中:
    Private Sub Command1_Click()
       Dim oApp As Word.Application
       Dim oDoc As Word.Document
       Dim oSel As Word.Selection
          
       Set oApp = New Word.Application
       oApp.Visible = True
       
       Set oDoc = oApp.Documents.Add
       Set oSel = oApp.Selection
       
       oSel.TypeText "This is a test. You too can automate Word."
       oSel.Start = 0
       
       oSel.Find.Execute "Word", , , , , , True, _
          wdFindContinue, , "Microsoft Word 2000", wdReplaceAll
          
       MsgBox "Did it work?"
       
       Set oSel = Nothing
       oDoc.Saved = True
       oDoc.Close
       Set oDoc = Nothing
       
       oApp.Quit
       Set oApp = Nothing
       
    End Sub
    					
  4. 项目菜单上单击引用。在引用对话框中,选择 Microsoft Word 8.0 对象库(或选择 Word 9.0 对象库、Word 10.0 对象库或 Word 11.0 对象库),然后单击确定
  5. 编译并运行这些代码,或按 F5 在调试器中运行这些代码。单击命令按钮,就会看到在“症状”部分中列出的错误。
  6. 通过按照“解决办法”部分中的说明重新注册 Word 类型库来纠正该问题,或使用以下代码替换 Selection 对象的早期绑定声明以使用晚期绑定:
        Dim oSel As Object
    					

属性

文章编号: 292744 - 最后修改: 2006年3月30日 - 修订: 4.1
这篇文章中的信息适用于:
  • Microsoft Office Word 2003
  • Microsoft Word 2002 标准版
  • Microsoft Word 2000 标准版
  • Microsoft Word 97 标准版
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft Visual Basic 6.0 企业版
  • Microsoft Visual C++ 6.0 专业版
关键字:?
kbbug kbnofix kbautomation KB292744
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com