0

我的任务是对旧版 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 行而不会出现错误。如果我将类引入主程序,则会引发类型不匹配错误。

任何帮助表示赞赏,在此先感谢您。

4

3 回答 3

2

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

任何一个

  • 通过 Set obj = New CTest 创建对象
  • 或者只是将类留在单独的 DLL 中?您确定它在单独的 DLL 中没有其他副作用吗?没有其他应用程序使用它?
于 2011-02-22T18:53:28.283 回答
2

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

于 2012-11-21T17:47:39.343 回答
1

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

于 2011-02-22T18:06:59.273 回答