2011-02-22 8 views
0

レガシー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ラインを通じて取得します。クラスをメインプログラムに組み込むと、型の不一致エラーがスローされます。

ご迷惑をおかけして申し訳ございませんが、よろしくお願いいたします。

答えて

2

CreateObjectは、公開されているCOMクラスでのみ動作します。したがって、メインプログラムにCTestを導入したため、CreateObjectは機能しなくなり、記述したようにエラーが発生します。

どちらか

  • 設定OBJ =新CTEST
  • それとも別のDLL内のクラスを残す経由してオブジェクトを作成しますか?別のDLLにあるという副作用はないのですか?それを使っている他のアプリはありませんか?
+0

私はちょうど別のDLLとしてそれを残してお勧めします。内部クラスをプロジェクトに移動する場合は、Project/Referencesダイアログを使用して(以前の)外部DLLへの参照を削除してください。それ以外の場合は、CreateObject呼び出しの1つを変更するのを忘れる可能性があります。その場合、外部DLL **からオブジェクト**を作成することになります。これは、内部クラスから作成したオブジェクトと互換性がありません。 cTest =新しいCTestの構文。それが起こるかどうかを知ることは非常に難しいでしょう... – JeffK

+0

@JeffK私は別のDLLとして残す必要があることに同意します。私は、CreateObject呼び出しがおそらくまだ外部DLLを呼び出していることに同意します。 DLL参照を削除してもこれは実際には防げません。レジストリからDLLの登録を解除する必要があります。 CreateObjectは、プロジェクト参照があるかどうかに関係なく、任意のオブジェクト(文字列内のProgIDに基づいて)を作成できます – MarkJ

+0

あなたは正しいです。私はVB6を使ってからしばらくしていましたが、実際にはCreateObjectを使用して、社内で使用するアプリケーション用のプラグイン機能を作成しました。プラグインDLLは、予期したインタフェースを実装するだけでした。明らかに私はいくつかの詳細を忘れてしまった。リフレッシュしてくれてありがとう! – JeffK

1

CTestを直接メインプログラムに組み込む場合、CreateObjectコールは必要ありません。通常の方法でインスタンス化するだけで、プログラムの一部になります。正常に動作するはずです。

2

私はちょうど1日半後にこれを解決しました。私の場合、私はdllを2回呼び出す。それが初めて働いたときに、それが上記のエラーを投げたのは2回目です。私はいくつかのプロジェクトを開いており、それぞれ独自の互換性設定を持っています。説明できない理由のために、共通のdllへの2番目の参照は互換性を持っていました。バージョンの互換性に正しいパスを設定し、バイナリ互換に設定することで問題は解決しました。

関連する問題