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

4

1 回答 1

0

我们将所有对 msado60_backcompat.tlb 的引用替换为对 msado26.tlb 的引用,这基本上撤销了我们在大约两年前过渡到 Windows 7 时首次实施的“修复”。这基本上都是由于微软引入的问题。对于那些想知道的人来说,研究这个问题的一个很好的起点就在这里。这使我们能够重建 Windows 7 机器上的所有内容并解决多个问题。

于 2013-10-04T20:06:14.447 回答