ある ActiveX DLL が別のインスタンスを作成しようとすると、紛らわしく一貫性のない結果が得られます。
コードベース全体を再構築するまで、すべてが機能していました。これは、数年前にそれを引き継いで以来一度も行ったことのないことです。以前は、必要に応じてピースを作成していました。
問題は複数の場所で発生していますが、代表的な例を次に示します。
Dim objMid As MiddlePiece.clsMyClass
Set objMid = CreateObject("MiddlePiece.clsMyClass")
これは、行でエラー (48: DLL のロード中にエラーが発生しました) をヒットしていますCreateObject
。コードを変更してみましたが、次の結果が得られました。
Dim objMid As MiddlePiece.clsMyClass
Set objMid = New MiddlePiece.clsMyClass
それは私にエラー48を再び与えます。
Dim objMid As Object
Set objMid = New MiddlePiece.clsMyClass
また、エラー 48 が発生します。
Dim objMid As Object
Set objMid = CreateObject("MiddlePiece.clsMyClass")
それは実際に機能します。
これらの本当の違いは何か、また、少なくとも最初のものは以前は機能していたのに、なぜ最後のものだけが機能するのかを説明できる人はいますか?
アーリー バインディングとレイト バインディングの違いは理解していると思います。最後の例だけがレイト バインディングの例ですが、ビルド PC とテスト マシンの両方で、レジストリに同じバージョンのMiddlePiece.dll であるため、これが失敗する理由は明確ではありません。
この問題は、MiddlePiece.dll が Microsoft ActiveX Data Objects で構築されていることが原因のようです。Windows XP から Windows 7 に移行して以来、これに関連する多くの問題がありました。msado26.tlb ライブラリは機能しなくなったため、代わりに msado60_Backcompat.tlb を参照するようにそのライブラリへの参照を変更する必要がありました。しばらくはうまくいったように見えましたが、その後、2 つの異なるバージョンの msado15.dll でさらに問題が発生しました。最新バージョンでは、VB6 と C++ の両方でコードが壊れています。