Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取VB6应用程序中缺少的组件错误_Vb6_Error Handling - Fatal编程技术网

获取VB6应用程序中缺少的组件错误

获取VB6应用程序中缺少的组件错误,vb6,error-handling,Vb6,Error Handling,我有一个VB6应用程序,它有大量的第三方组件。该应用程序运行良好,但在退出时(并且仅当作为独立EXE运行时,例如不在IDE中),它会弹出一条错误消息: 我以前见过类似的错误,但通常会显示哪个组件缺少依赖项或未正确注册 我通过Process Monitor运行了它,得到了它找不到的以下文件: 然后它就退出了。我用谷歌搜索了它找不到的文件名,似乎什么也找不到。它似乎在寻找MSComENU、MSComEN和MSCOENU DLL的变体 我反复检查以确保所有的第三方组件都在那里,并且它们都在-应用程

我有一个VB6应用程序,它有大量的第三方组件。该应用程序运行良好,但在退出时(并且仅当作为独立EXE运行时,例如不在IDE中),它会弹出一条错误消息:

我以前见过类似的错误,但通常会显示哪个组件缺少依赖项或未正确注册

我通过Process Monitor运行了它,得到了它找不到的以下文件:

然后它就退出了。我用谷歌搜索了它找不到的文件名,似乎什么也找不到。它似乎在寻找MSComENU、MSComEN和MSCOENU DLL的变体

我反复检查以确保所有的第三方组件都在那里,并且它们都在-应用程序功能正常,如果它们不在那里就不会有

值得注意的是,在触发VB6代码的最后一行(在
Form_Unload
事件中)后会发生错误。我知道这一点,因为最后一行是出现的消息框

很久很久以后编辑:我终于重新开始处理这个问题,并通过消除过程(这是一个漫长的过程)解决了它。最后,它与任何MSCOMM*.dll条目无关。事实上,我不知道为什么它们仍然出现在进程监视器中。问题简单得多

我在主窗体上有几个第三方控件。为了不让大量事件处理代码污染主窗体,我将这些控件委托给了一个新类,如下所示:

' declaration code in main form'
Private WithEvents moDelegateObject as clsDelegateObject

' still in the main form, after initialization'
Set moDelegateObject = new clsDelegateObject
With moDelegateObject
    Set .ThirdPartyCtlHandler1 = me.ThirdPartyCtl1
    Set .ThirdPartyCtlHandler2 = me.ThirdPartyCtl2
    Set .ThirdPartyCtlHandler3 = me.ThirdPartyCtl3
end with

' declarations and properties inside of clsDelegateObject'
Private WithEvents moThirdPartyCtlHandler1 as ThirdPartyCtl
Private WithEvents moThirdPartyCtlHandler2 as ThirdPartyCtl
Private WithEvents moThirdPartyCtlHandler3 as ThirdPartyCtl
Public Event FooEvent() ' other various events as well '

Public Property Set ThirdPartyCtlHandler1(o as ThirdPartyCtl) 
    moThirdPartyCtlHandler1 = o
End Property 
Public Property Get ThirdPartyCtlHandler1() as ThirdPartyCtl
    ThirdPartyCtlHandler1 = moThirdPartyCtlHandler1 
End Property
' ... Repeat for each handler ...'
缺少的是在关闭之前显式释放这些对象的代码。这是VisualBasic通常做的事情。因此,我在主表单的表单_QueryClose中添加了以下内容:

With moDelegateObject
    Set .ThirdPartyCtlHandler1 = Nothing
    Set .ThirdPartyCtlHandler2 = Nothing
    Set .ThirdPartyCtlHandler3 = Nothing
End with
Set moDelegateObject = Nothing  

最后一行是超级棒,但为了完整起见,我把它扔了进去。我认为这是将控件委托给委托类、以主窗体接收来自委托类的事件以及使用大量真正模糊的第三方控件的组合,这导致了这个问题。很可能第三方控件未完全解除分配自身。不管怎么说,我已经吸取了教训

这可能是DLL\u进程\u分离或初始化问题。陈雷蒙的博客“新旧事物”中有几篇相关文章:

正如您所说,这些是第三方组件。您可以尝试制作更小的测试用例,直到问题消失,以确定有缺陷的组件。您还可以尝试本机代码调试器并分析是什么代码创建了错误消息


然而,解决该问题的最简单解决方案是尝试强制所有这些组件的特定加载顺序。在Main()或启动窗体中,尝试按固定顺序使用每个第三方组件的某些功能。如果错误仍然出现,请更改顺序,直到问题消失。这可能有效。

您可以尝试在项目文件中的引用列表中使用,以查看这些第三方文件是否缺少依赖项。如果没有缺少依赖项,请尝试使用重新注册文件。如果任何regsvr32命令失败,则您可能已找到缺少依赖项的组件。

+1@匿名亲密选民:这是一个好问题。这些问题很难诊断,分享专业知识非常有用。这个问题是特定于一台计算机(开发机器?),还是可以在其他计算机上重复?它是在一个以前工作正常的应用程序中开始发生的吗?在我看来,好像发生了一些错误(或者只是libload失败)在美式英语计算机/用户会话上运行的MSComm32.dll的外语版本中,试图加载美式英语区域设置的错误消息资源dll。@MarkJ它可在其他计算机上重复。奇怪的是,我有一个类似的应用程序,具有完全相同的依赖项集,安装和运行都非常好(安装版本也从相同的位置提取依赖项)。@BobRiemersma你是说
MSCOMM32.OCX
?因为我不认为我在任何地方引用了MSCOMM32.DLL,MSCOMM32.OCX也不依赖于它。在重新注册组件之前,请先尝试注销(regsvr32/u[COMPONENT])。对我来说,这曾经起过作用。