Ошибка несоответствия типов в устаревшем приложении VB6 при создании объекта ActiveX - PullRequest
0 голосов
/ 22 февраля 2011

Мне было поручено внести изменения в устаревшее приложение VB6 Winform. Я обнаружил, что это приложение было излишне разделено на несколько библиотек 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 без ошибки. Если я внесу класс в основную программу, он выдаст ошибку несоответствия типов.

Любая помощь приветствуется, спасибо заранее.

Ответы [ 3 ]

2 голосов
/ 22 февраля 2011

CreateObject будет работать только с публично видимыми COM-классами. Поэтому, поскольку вы включили CTest в свою основную программу, CreateObject больше не будет работать и будет вызывать ошибки, как вы описали.

Либо

  • Создать объект с помощью Set obj = New CTest
  • Или просто оставить класс в отдельной DLL? Вы уверены, что нет никаких других побочных эффектов того, что он находится в отдельной DLL? Никакое другое приложение не использует это?
2 голосов
/ 21 ноября 2012

Я только что решил это через полтора дня. В моем случае я вызываю DLL дважды. Первый раз сработало и второй раз выкинуло ошибку выше. У меня открыто несколько проектов, и у каждого есть свой собственный параметр совместимости. По какой-то необъяснимой причине во второй ссылке на обычную dll была установлена ​​совместимость. Установив правильный путь в совместимости версий и установив бинарную совместимость, проблема разрешилась.

1 голос
/ 22 февраля 2011

Если вы вводите CTest непосредственно в свою основную программу, вам не нужен вызов CreateObject - просто создайте его экземпляр обычным способом, теперь, когда он является частью вашей программы, и он должен нормально работать.

...