PRB: 跨进程 COM 自动化可以挂起 win95/98 上的客户端应用程序

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

症状

当自动化客户端应用程序的进程外 COM 服务器时,如果客户端代码进入紧密循环或发出大量请求以获取新的界面,客户端应用程序可能会要求用户异常会终止该进程的自动化调用过程中挂起。后挂起,涉及已封送的接口的任何 COM 请求将失败。若要清除问题需要重新启动。

在 Windows 95 和 Windows 98 系统上只出现问题。

原因

跨进程边界封送接口时, 创建系统对象的一个数字来处理客户端和服务器进程之间的通信。这包括代理/存根,OID 以及 OXID 需要通过 COM 来识别被封送该接口。由客户端进程中松开该接口时这些对象将被销毁垃圾回收期间。

通过设计,COM 使用惰性垃圾回收释放不再需要的系统资源。相对的无活动期间,发生此集合。如果客户端应用程序没有提供足够的空闲时间进行垃圾回收发生,则系统会耗尽资源,并不再能封送的接口。如果发生这种情况在 COM 层本身可能损坏,防止进一步垃圾回收之前重新启动系统。

此问题最常见的原因是客户端的代码已进入一个紧密循环,或者正在执行自动化涉及一个嵌套的对象层次结构的较高强度段位置获取和释放在短时间内的多个进程外对象进行连续调用。例如对于下面的代码示例显示了一个嵌套的对象层次结构,需要三个接口,每次调用 PrintOut 方法被封送的。因为在一个紧密循环中运行代码,为 30,被封送的接口的总数:
   For i = 1 To 10
      oExcel.ActiveWorkbook.Sheets(i).UsedRange.PrintOut
   Next i
				
对于 Windows 95 和 Windows 98,可以将一次封送的接口的总数是大约 65,536。

解决方案

开发人员需要最大限度地减少他们请求在紧凑循环过程中的对象引用数或 $ 粗期间的自动化。如果不止一次需要接口,则它应被保存到并而不是发布并 reacquired 中连续多次重复使用。

例如对于上面的示例的此修改的版本执行相同的任务,但只需要两个接口进行封送处理为每个 PrintOut 调用 (上面的代码从 30%缩减):
   Set oBook = oExcel.ActiveWorkbook
   For i = 1 To 10
      oBook.Sheets(i).UsedRange.PrintOut
   Next i
				
另一个可能的解决方案可能会将自动化代码中的过程中的一部分移到了的服务器,如果服务器允许进程内编写脚本。例如对于 Microsoft Office 产品集成了 VBA 的内部自动化的脚本。通过将循环代码移动到 VBA 模块中,您可以避免封送处理多个的接口,而是调用一个宏,使服务器可以完成所有工作。

参考

有关更多的信息,请参阅下面 Microsoft 知识库中相应的文章:
219905HOWTO: 动态添加和从 Visual Basic 运行 VBA 宏

属性

文章编号: 216400 - 最后修改: 2007年1月24日 - 修订: 4.4
这篇文章中的信息适用于:
  • Microsoft Windows 95
  • Microsoft Windows 98 Standard Edition
  • Microsoft Windows Millennium Edition
关键字:?
kbmt kbautomation kboleapp kbprb KB216400 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 216400
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