我有个工程,由于引用了其他的DCOM/COM技术,经常会发生:自动化错误:440,程序就会直接崩溃退出了.这个错误不是经常发生.如果程序运行一段时间后,就会发生.但我在用源码时也是直接退出了,因而无法判断什么地方出错,请问如何解决440错误?或是如何捕捉440错误而不要让程序崩溃退出?很是着急.盼高人解决!

解决方案 »

  1.   

    处理引用对象中的错误如果在过程中引用了一个或多个对象,要确定错误在何处发生就变得比较困难,尤其是错误发生在另一应用程序的对象中。例如,假设一个应用程序由一个窗体模块(MyForm)组成,MyForm引用一个类模块(MyClassA),类模块又引用了一个Microsoft Excel 工作表对象。如果工作表对象不能处理工作表中产生的某个特定错误,它会重新生成一个错误,Visual Basic 将这个错误传递给引用工作表的对象MyClassA。Visual Basic 自动将未捕获的Visual Basic 外的对象中产生的错误映射为错误代码440。MyClassA对象要么能处理错误(最好能)要么能重新生成一个错误。过程间的接口要求任何对象在重新生成一个引用对象中出现的错误时,不能只简单地传递错误(传递错误代码440),而应将错误号与具体含义映射起来。当你重新映射错误时,如果错误处理程序可确定该错误与定义的Visual Basic 错误相类似(例如,溢出或被零除等),那么错误号可以是表明错误情况的Visual Basic 定义数值,另外,错误号还可以是Visual Basic 未定义的错误号。在Visual Basic 常量vbObjectError中添加新数值,将对象产生的错误通知其他处理程序。只要可能,应在一个类模块中尽力处理模块本身产生的所有错误,并还应尽力处理模块所引用的对象中产生的对象不能处理的错误。然而,由于一些错误是不能预计的,因此仍存在一些不能处理的错误。另外,有些情况下,在引用对象中处理错误比在被引用对象中处理错误更适宜。当错误在窗体模块中发生时,Visual Basic 产生一个预先定义的Visual Basic 错误号。注:如果你在创建一个公用类,要保证明确表述了你所定义的每个非Visual Basic 错误处理程序的含义。其他程序员在引用这个公用类时,需要知道如何处理你定义对象所产生的错误。在重新生成一个错误时,保持Err对象的其他属性不变化。如果未捕获产生的错误,Source和Description属性将被显示出来,以帮助用户采取更正措施。处理从引用对象传递的错误一个类模块可包括下列错误处理程序,以解决任何可捕获的错误和重新生成不能解决的错误。 MyServerHandler:   Select Case ErrNum          Case 7        ' 处理内存溢出错误                 ..          Case 440    ' 处理外部对象错误             Err.Raise Number:=vbObjectError + 9999      ' 来自另一Visual Basic 对象的错误          Case Is > vbObjectError and Is < vbObjectError + 65536             ObjectError = ErrNum          Select Case ObjectError                 ' 对象根据为其提供的错误号处理错误             Case vbObjectError + 10                 ..             Case Else                    ' 将错误与通用对象错误映射并重新生成错误                    Err.Raise Number:=vbObjectError + 9999             End Select          Case Else                 ' 将错误与通用对象错误映射并重新生成错误             Err.Raise Number:=vbObjectError + 9999   End Select   Err.Clear   Resume Next错误号440捕获那些在Visual Basic 应用程序外的引用对象中产生的错误。在本示例中,错误只是简单地用9999传递,因为这种集中化的处理程序很难确定错误的原因。发生这种错误通常是致命的自动化错误(会导致某组件结束运行)的结果,或者是由于对象不能正确处理一个捕获的错误。只有出现致命错误,错误号440才会被传递。如果象前面在“直接错误处理”中讨论的那样为一个内部处理程序编写错误陷井,则有可能确定错误的产生原因并更正错误。语句Case Is > vbObjectError and Is < vbObjectError + 65536捕获发生在Visual Basic 应用程序内部对象的错误和捕获发生在包含处理程序的同一对象中的错误。只有被对象定义了的错误才处于vbObjectError偏差值范围内。提供给对象的错误代码清单应定义所有可能的错误代码及其含义,这样,编写的处理程序就能灵活解决预计的错误。实际的错误代码可被设计为无vbObjectError偏差值的形式,或者在添加偏差值后编排错误代码,在这种情况下,Case Else语句应减去vbObjectError而不是加上偏差值。另一方面,对象错误可以是显示在对象类型库中的常量,如“对象浏览器”所示。在这种情况下,在Case Else语句中使用错误常量而不是错误代码。任何未处理的错误应以一个新号重新生成,如Case Else语句所示。在编写的应用程序中,你可设计一个处理程序来预测你所定义的新号。如果是一个公用类,你还需要在应用程序文档说明中对新错误处理代码添加注释。最后的Case Else语句捕获并重新生成在处理程序中未被捕获的任何错误。由于这部分的错误陷井会捕获添加或未添加vbObjectError常量的错误,因此,你应把这些错误与通用的“不可解决的错误”代码相映射。这个代码应添加到vbObjectError中,为任何处理程序指出发生在被引用对象中的错误。
      

  2.   

    不可能是注册问题,因为是偶尔会出现这个问题,即同一个过程可能大部分时候都正常运行,但偶然会出现440错误,程序就直接退出了.我在每个过程当中都用了错误处理:on error goto #no. 但就是捕捉不到440错误.很是郁闷.
    zq972d的文章我也在微软的网站上看过.但这个是可以自己在类模块中处理错误代码,但这个工程是别人已封装过的自己没法弄的.
    很是郁闷.!!!!!
      

  3.   

    使用DCOM/COM组件时其尚未初始化完成?弄点延时吧