【问题标题】:Legacy VB6 app throwing type mismatch error during ActiveX create object旧版 VB6 应用程序在 ActiveX 创建对象期间引发类型不匹配错误
【发布时间】:2012-11-22 01:47:39
【问题描述】:

我的任务是对旧版 VB6 Winform 应用程序进行更改。我发现这个应用程序被不必要地拆分为多个 DLL(一些 DLL 只是几个类)。所以,我正在努力将一些 DLL 整合到主程序中,但我遇到了一个问题,我可以使用一些帮助。

其中一个 dll 包含一个名为 CTest(Test.cls) 的类。主程序在以下代码行中使用了它。 strProgId 是一个命名另一个 DLL 的字符串。

Dim objTest As CTest 

Set objTest = CreateTestObject(strProgId)

Public Function CreateTestObject(strProgId As String) As Object
10        On Error GoTo ErrorHandler
20        Set CreateTestObject = CreateObject(strProgId)
30        Exit Function
ErrorHandler:
40        UpdateErrorInfo "CreateTestObject", "Globals", strProgId
50        HandleError
End Function

这是CTest的内容

Option Explicit


Private m_strName As String
Private m_strDescription As String
Private m_cnnADO As ADODB.Connection

Public Property Get Name() As String
10        Name = m_strName
End Property

Public Property Let Name(strNewName As String)
10        m_strName = strNewName
End Property

Public Property Get Connection() As ADODB.Connection
10        Set Connection = m_cnnADO
End Property

Public Property Set Connection(cnnADO As ADODB.Connection)
10        Set m_cnnADO = cnnADO
End Property

Public Property Get Description() As String
10        Description = m_strDescription
End Property

Public Property Let Description(strNewDescription As String)
10        m_strDescription = strNewDescription
End Property

Public Function Run(ByVal strSTMType As String, _
                    instInstruments As CInstruments, objResults As CTestResults) As Boolean

End Function

如果 CTest 仍然是 DLL 的一部分并且我在主程序中有对它的引用,它会通过 CreateTestObject 行而不会出现错误。如果我将类引入主程序,则会引发类型不匹配错误。

感谢您的帮助,提前感谢您。

【问题讨论】:

    标签: vb6 activexobject


    【解决方案1】:

    CreateObject 仅适用于公开可见的 COM 类。因此,由于您已将 CTest 带入主程序,因此 CreateObject 将不再工作,并且会像您描述的那样引发错误。

    要么

    • 通过 Set obj = New CTest 创建对象
    • 或者只是将类留在单独的 DLL 中?您确定它在单独的 DLL 中没有其他副作用吗?没有其他应用在使用它?

    【讨论】:

    • 我建议也将其保留为单独的 DLL。如果您决定将内部类移动到项目中,请务必使用“项目/引用”对话框删除对(以前)外部 DLL 的引用。否则,您很有可能会错过更改其中一个 CreateObject 调用,然后该调用将成功地从外部 DLL 中创建一个对象,这将与您使用从内部类创建的对象不兼容Set cTest = New CTest 语法。这将很难弄清楚它是否会发生......
    • @JeffK 我同意它应该作为单独的 DLL 保留。我同意 CreateObject 调用可能仍在调用外部 DLL。删除 DLL 引用实际上不会阻止这种情况 - 您必须从注册表中取消注册 DLL。 CreateObject 可以创建任何对象(基于字符串中的 ProgID),无论您是否有项目引用
    • 你是对的。自从我使用 VB6 以来已经有一段时间了,但实际上我使用 CreateObject 为我们内部使用的应用程序创建插件功能,其中插件 DLL 只需实现预期的接口。显然我忘记了一些细节。感谢您的复习!
    【解决方案2】:

    我在一天半后才解决了这个问题。就我而言,我调用了 dll 两次。它第一次工作,第二次抛出上述错误。我打开了几个项目,每个项目都有自己的兼容性设置。出于某种无法解释的原因,对公共 dll 的第二次引用引起了兼容性问题。通过在版本兼容性中设置正确的路径并将其设置为二进制兼容性,问题就解决了。

    【讨论】:

      【解决方案3】:

      如果您将 CTest 直接引入您的主程序,那么您不需要调用 CreateObject - 只需以正常方式实例化它,现在它是您程序的一部分,它应该可以正常工作。

      【讨论】:

        猜你喜欢
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多