我的任务是改变传统的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行而没有错误。如果我将类引入主程序,则会引发类型不匹配错误。
感谢任何帮助,谢谢你。
答案 0 :(得分:2)
CreateObject仅适用于公开可见的COM类。因此,因为您已将CTest引入主程序,CreateObject将不再起作用,并且会像您描述的那样引发错误。
要么
答案 1 :(得分:2)
我在一天半之后解决了这个问题。在我的情况下,我两次调用DLL。它第一次工作,第二次抛出上面的错误。我打开了几个项目,每个项目都有自己的兼容性设置。由于某些无法解释的原因,对公共dll的第二个引用具有兼容性。通过在版本兼容性中设置正确的路径并将其设置为二进制兼容性,问题得以解决。
答案 2 :(得分:1)
如果您直接将CTest引入主程序,那么您不需要CreateObject
调用 - 只需以正常方式实例化它,现在它是您程序的一部分,它应该可以正常工作。