6

我们正在将大量应用程序从 Windows XP 迁移到 Windows 7,并且遇到了 Word Automation 的一个老问题。

我们在我们的一个应用程序中遇到了一个问题,当我们尝试连接到 Word 时,我们会收到“呼叫被 Callee 拒绝”,除非它已经打开。我们在 Delphi 2000 / Windows XP 中使用以下代码解决了这个问题:

WordApp.Connect;
WordApp.Visible := True;
WordApp.Documents.Add(Template, EmptyParam, EmptyParam, EmptyParam);
WordApp.ChangeFileOpenDirectory(jdir);
WordApp.Visible := False;
WordDoc.ConnectTo(WordApp.ActiveDocument);

这在 Windows 7 下不再有效 - 在 XE2 下重新编译似乎没有帮助。

我在这里看到了一个与Visual Studio 有关的相关问题 - 任何人都知道如何将其应用于 Delphi(XE2 在这个阶段会很好)

4

1 回答 1

9

当您连接/连接到的实例当前处于交互模式时,会发生“被调用者拒绝呼叫”错误:例如打开的对话框。或者,在 Excel 中,正在编辑的单元格,甚至处于正在编辑的单元格被用户从应用程序切换到中断的状态 - 当他返回时,它可能看起来编辑已完成,但交互式在选择不同的单元格之前,模式不会结束。

因此,我不明白为什么在连接时出现此错误,除非另一个实例已经打开。如果没有实例打开(且可见),Word 不能处于交互模式,您不应该收到错误。您的补救措施是否可能只是规避了真正的问题?

无论如何,您都处于尝试连接到处于交互模式的实例的情况。事先,或由您的代码引起。当您从 XP 切换到 Windows 7 时,UAC 确实是一个可能的罪魁祸首。

我会取消解决方法,看看它会把你带到哪里。

对于 Word 自动化,我始终确保:

  • 我通过使用 ckNewInstance 的 ConnectKind 和
  • 确保我没有让我的专用实例可见或
  • 确保我只在完成所有操作后才使其可见,并且可以将实例移交给用户。

如果您别无选择,只能针对可见的(因此非专用的)Word 实例进行自动化处理,您只需处理出现此错误的可能性。当它发生时,提醒用户正在发生的事情并确保您提供重试。

更新 @Hendra 在评论中提到的 Embarcadero 论坛上的线程包括指向一些非常有用的 MSDN 文档的链接:修复“应用程序忙”和“被调用者拒绝呼叫”错误

于 2012-06-28T21:12:02.427 回答