“被呼叫被拒绝的电话”

时间:2012-06-28 16:38:05

标签: delphi ms-word delphi-xe2 office-automation

我们正在将大量应用程序从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有关的问题here - 任何人都知道如何将它应用于Delphi(XE2在这个阶段会很好)

1 个答案:

答案 0 :(得分:8)

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

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

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

我会废除解决方法,看看你需要做什么。

对于Word自动化,我总是确保:

  • 我使用ckNewInstance和
  • 的ConnectKind连接到专用实例
  • 确保我不会显示我的专用实例或
  • 确保我在完成所有操作后才能使其显示,并且可以将实例转交给用户。

如果你没有选择,只能对可见(因而非专用)的Word实例进行自动化,你只需要处理出现此错误的可能性。如果是,请提醒用户注意发生的情况,并确保提供重试。

<强>更新 @Hendra评论中提到的Embarcadero论坛上的帖子包含一些非常有用的MSDN文档的链接:Fixing 'Application is Busy' and 'Call was Rejected By Callee' Errors