レガシーVB6 Winformアプリケーションを変更する作業がありました。私が見つけたのは、このアプリが不必要に複数のDLLに分割されていたことです(いくつかのDLLは単にいくつかのクラスでした)。だから、いくつかのDLLをメインプログラムに統合する作業をしていますが、私はいくつかの助けを借りて問題を抱えています。レガシーVB6アプリケーションがActiveXの作成中にタイプミスマッチエラーを発生しました
dllの1つに、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ラインを通じて取得します。クラスをメインプログラムに組み込むと、型の不一致エラーがスローされます。
ご迷惑をおかけして申し訳ございませんが、よろしくお願いいたします。
私はちょうど別のDLLとしてそれを残してお勧めします。内部クラスをプロジェクトに移動する場合は、Project/Referencesダイアログを使用して(以前の)外部DLLへの参照を削除してください。それ以外の場合は、CreateObject呼び出しの1つを変更するのを忘れる可能性があります。その場合、外部DLL **からオブジェクト**を作成することになります。これは、内部クラスから作成したオブジェクトと互換性がありません。 cTest =新しいCTestの構文。それが起こるかどうかを知ることは非常に難しいでしょう... – JeffK
@JeffK私は別のDLLとして残す必要があることに同意します。私は、CreateObject呼び出しがおそらくまだ外部DLLを呼び出していることに同意します。 DLL参照を削除してもこれは実際には防げません。レジストリからDLLの登録を解除する必要があります。 CreateObjectは、プロジェクト参照があるかどうかに関係なく、任意のオブジェクト(文字列内のProgIDに基づいて)を作成できます – MarkJ
あなたは正しいです。私はVB6を使ってからしばらくしていましたが、実際にはCreateObjectを使用して、社内で使用するアプリケーション用のプラグイン機能を作成しました。プラグインDLLは、予期したインタフェースを実装するだけでした。明らかに私はいくつかの詳細を忘れてしまった。リフレッシュしてくれてありがとう! – JeffK