一个 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 数据对象构建的。自从我们从 Windows XP 迁移到 Windows 7 以来,已经有很多与此相关的问题。msado26.tlb 库不再为我们工作,因此我们不得不更改对该库的引用,改为引用 msado60_Backcompat.tlb。这似乎工作了一段时间,但我们在使用两个不同版本的 msado15.dll 时遇到了更多麻烦。最新版本正在破坏 VB6 和 C++ 中的代码。