0

ある 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++ の両方でコードが壊れています。

4

1 に答える 1

0

msado60_backcompat.tlb へのすべての参照を msado26.tlb への参照に置き換え、約 2 年前に Windows 7 に移行したときに最初に実装した「修正」を実質的に取り消しました。これは基本的にすべて、Microsoft によって導入された問題によるものです。知りたい人のために、問題を調査するための良い出発点はここにあります. これにより、Windows 7 マシン上のすべてを再構築し、複数の問題を解決することができました。

于 2013-10-04T20:06:14.447 に答える