gpt4 book ai didi

com - VB.Forms 处出现错误 -2147417848。通过 COM 添加调用

转载 作者:行者123 更新时间:2023-12-04 20:16:47 24 4
gpt4 key购买 nike

我有一个引用 VB6 遗留 DLL 的 .NET 应用程序。遗留 DLL 有一个带有公共(public)方法的类。在此公共(public)方法中,它试图通过名称查找现有表单,如果不存在则创建它:

Set objForm = GetForm(strFormName)

If objForm Is Nothing Then

'Creates a new instance of the form
Set objForm = VB.Forms.Add(strFormName)

End If

... GetForm 是:

Private Function GetForm(ByVal strFormName As String) As Form

Dim objForm As Form

For Each objForm In VB.Forms
If objForm.Name = strFormName Then
Set GetForm = objForm
Exit Function
End If
Next

Set GetForm = Nothing

End Function

它在这一行引发错误:

Set objForm = VB.Forms.Add(strFormName)

错误是:

Automation error
The object invoked has disconnected from its clients.
Error#-2147417848(80010108)

请注意,strFormName 是一个有效的表单名称,并且此公共(public)方法调用几乎一直有效。它只是偶尔会引发此错误。

我想知道是什么导致了这个错误,或者我还能做些什么来进一步追踪它?

最佳答案

KB article @Dabblernl 链接与这个问题非常相关。 VB.Forms 集合正是这样一个不合格的引用。它就像一个全局变量,您可以在 VB6 代码中的任何地方使用 VB.Forms,而无需提供对象引用。

在幕后,VB6 运行时会在您第一次创建表单时创建 Forms 集合并存储此集合对象,以便将来对 VB.Forms 的引用使用完全相同的集合。错误代码的意思是您在它被销毁后使用了该集合

具体何时发生还不是很清楚,这是 VB6 运行时支持库的所有内部管道。但通常情况下,VB6 应用程序会在最后一个窗体被卸载时终止。您的情况有所不同,您的进程的生命周期不再由 VB6 运行时控制。 .NET 现在控制它。

因此,据此推断,VB6 运行时很有可能已决定不再需要 Forms 集合并将其销毁,并且您的 .NET 代码稍后可能会创建一个新的 Form,从而触发错误。

如果这完全准确,那么您需要采取对策来防止这种情况发生。一种可能的方法是确保始终至少有一个 VB6 表单来保持集合有效。它不一定是可见的。

关于com - VB.Forms 处出现错误 -2147417848。通过 COM 添加调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com