在VB6应用程序中丢失组件错误

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

我以前看过这样的错误,但通常它说哪个组件缺少依赖关系或没有正确注册.

我通过进程监视器运行它,并获得它找不到的以下文件

然后就退出了.我搜索了它找不到的文件名,似乎找不到任何东西.它似乎是搜索了MSComENU,MSComEN和MSCOENU dll的变体.

我检查并重新检查,以确保所有的第三方组件都在那里,他们是 – 应用程序功能正常,如果他们不在那里不会.

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

很多时候,编辑:我终于回到了处理这个问题,并通过消除过程来解决(这是一个很糟糕的过程).最终它与任何MSCOMM * .dll条目无关.事实上,我不知道为什么它们仍然显示在Process Monitor中.问题要简单得多

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

' 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 ...'

缺少的是在关闭之前明确地释放这些对象的代码.这是Visual Basic通常所做的.所以我在Form_QueryClose中添加了以下主窗体:

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

最后一行竟然是超凡的,但是我把它丢在了那里,是为了完整的.我认为这是将委托委托给代理类并从主窗体中接收事件的组合,并使用了许多真正晦涩的第三方控件来帮助这个问题.第三方控制很可能不会自动释放.无论如何,吸取教训.

这可能是一个DLL_PROCESS_DETACH或CoUninitialize问题.陈老师的博客“老新事物”有几篇相关文章

> When DLL_PROCESS_DETACH tells you that the process is exiting,your best bet is just to return without doing anything
> Do you know when your destructors run? Part 1.
> Quick overview of how processes exit on Windows XP
> How you might be loading a DLL during DLL_PROCESS_DETACH without even realizing it
> The thread that gets the DLL_PROCESS_DETACH notification is not necessarily the one that got the DLL_PROCESS_ATTACH notification

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

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

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...