如何在编译VB 6程序时修复“意外错误(32801)”?

时间:2010-03-08 14:37:12

标签: vb6 activex

我必须维护一个旧的VB 6 ActiveX DLL,由另一个第三方程序调用,我没有任何来源等。这个DLL工作并编译好所述程序的API大约6年和3个主要版本。

但是现在当我尝试针对新的主要版本编译DLL时,会发生上述错误。似乎错误发生在“my”代码被调用之前,因此没有使用调试或日志记录。唯一的补救措施是编译无二进制兼容性,这不是真正的选择。我的谷歌搜索很多人遇到了同样的问题但没有解决方案。

这里有人知道如何解决这个问题吗?

提前致谢

万岁

5 个答案:

答案 0 :(得分:3)

我终于弄清楚如何以系统的方式诊断VB6错误32801。

我的理论是当VB6编译器创建项目或二进制兼容库时,编译器会从引用的库中反编译类型信息。错误32801发生源代码的类型信息与引用的库不同。

有一个名为OLEView的工具。此工具可以将COM类型信息反编译为IDL文本。我所做的是将引用的库反编译为IDL并获取失败库的最后一个良好版本。大多数情况下,它是构建服务器版本,但构建在开发人员工作站上不起作用。反编译最后的好构建。使用文本比较工具,如WINMerge,找到类型库之间的差异。这些差异使得追踪问题变得容易。

根据差异将决定如何纠正。可以通过更正参考DLL,或通过源代码更正或源代码引用来完成缓解。

答案 1 :(得分:1)

听起来,新DLL中定义的接口中的某个类型与前一个DLL中的类型不同。我推断你在DLL的公共接口中使用第三方程序中定义的类型。听起来像第三方改变了其中一种类型的定义,但保持名称和GUID相同。您可以使用类似OLE/COM Object viewer的内容来检查是否属实。如果确实如此,那么您可以向第三方计划的发布者投诉。你有足够的政治权力来取得成功吗?

编写Hardcore Visual Basic 6的大师Bruce McKinney在类型库中使用结构运行into the same issue,在那里他更改了一些成员类型。他能找到的唯一解决方案是(基本上)打破二进制兼容性 - 这是在与VB6编译器团队进行一些通信之后,他对此非常熟悉。我认为其他任何人都无法做得更好。

答案 2 :(得分:0)

devx.com上有关于此错误的讨论似乎表明问题源于Microsoft的脚本运行时(scrrun.dll)。

FileSystemObject compatibility Unexpected error (32810)

您的DLL是否引用该库?如果是这样,你可以删除引用(例如,用内部VB文件处理函数和/或API调用替换FileSystemObject功能)。

答案 3 :(得分:0)

与核心项目相关联的任何文件是否都被标记为只读(即未检出SourceSafe或类似的存储库)?

*。EXP * .vbw *的.lib

答案 4 :(得分:0)

---------------------------
Microsoft Visual Basic
---------------------------
Unexpected error (32810)
---------------------------
OK   Помощ   
---------------------------

这是我正在尝试在VBIDE中引用最近已重新编译的旧OCX的消息。

经过长时间的研究,导致此错误的令人反感的代码行似乎是

Property Get MouseActivate() As BookmarkEnum

只需将其更改为

Property Get MouseActivate() As Boolean

。 。 。错误消失了。

BookmarkEnum是ADO的枚举。我们的构建服务器是Server 2003,而开发计算机是Win10。该项目引用了ADO 2.8,但显然,此typelib在Server 2003和Win10上有一些区别