"被呼叫被拒绝的电话"

Dan*_*lly 5 delphi ms-word office-automation delphi-xe2

我们正在将大量应用程序从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);
Run Code Online (Sandbox Code Playgroud)

这不再是Windows 7下的技巧 - 并且在XE2下重新编译似乎没有帮助.

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

Mar*_*ema 9

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

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

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

我会废除解决方法,看看你需要的地方.

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

  • 我通过使用ckNewInstance和的ConnectKind连接到一个专用实例
  • 确保我没有让我的专用实例可见或
  • 确保我在完成所有操作后才能使其可见,并且可以将实例转换为用户.

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

更新 @Hendra评论中提到的Embarcadero论坛上的帖子包含一些非常有用的MSDN文档的链接:修复"应用程序忙碌"和"调用被Callee拒绝"错误

  • 另请参阅(https://forums.embarcadero.com/thread.jspa?messageID=437814)以了解如何使用OleMessageFilter. (6认同)
  • @Hendra:很好,感谢链接.该主题中的链接非常有用.已经将它添加到我的答案中,但我认为你应该添加你的评论作为这个问题的答案,或许还有一个小的摘要,因为不鼓励在SO上使用"仅限链接"的答案.我肯定会赞成它. (2认同)