代码之家  ›  专栏  ›  技术社区  ›  banzai

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

  •  3
  • banzai  · 技术社区  · 16 年前

    我必须维护另一个第三方程序调用的旧的vb 6 activex dll,对此我没有任何来源等。该dll可以工作,并根据该程序的API编译大约6年和3个主要版本。

    但是现在,当我试图根据一个新的主要版本编译DLL时,出现了上面提到的错误。似乎错误发生在调用“我的”代码之前,因此没有调试或日志记录的用处。唯一的补救办法是编译w/o二进制兼容性,这不是真正的选择。我在谷歌搜索中发现很多人都有同样的问题,但没有解决方案。

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

    提前谢谢

    小精灵

    5 回复  |  直到 16 年前
        1
  •  1
  •   MarkJ    16 年前

    听起来,新dll中定义的接口中的某个类型与前一个dll中的类型不同。我推断您在DLL的公共接口中使用在第三方程序中定义的类型。在我看来,第三方改变了其中一种类型的定义,但保持了名称和guid的一致性。你可以用类似的东西 OLE/COM Object viewer 来检查这是不是真的。如果是真的,那么你可以向第三方程序的发布者投诉。你有足够的政治权力来成功吗?

    布鲁斯·麦金尼,写作大师 Hardcore Visual Basic 6 into the same issue 在类型库中的结构中,他更改了一些成员类型。他能找到的唯一解决办法是(本质上)打破二进制兼容性——这是在与他相当熟悉的vb6编译器团队通信之后。我认为没有人能做得更好。

        2
  •  3
  •   Robert Livermore    13 年前

    最后,我找到了如何系统地诊断VB6错误32801。

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

    有一个叫做oleview的工具。此工具可以将COM类型信息解压缩为IDL文本。我要做的是将引用的库反编译到IDL中,并对失败的库进行最后一次良好的构建。大多数情况下,它是一个构建服务器版本,但构建在开发人员工作站上不起作用。反编译最后一个好的构建。使用文本比较工具(如WinMerge)查找类型库之间的差异。这些差异使得跟踪问题变得容易。

    根据差异将决定如何更正。可以通过更正引用dll、源代码更正或源代码引用来进行缓解。

        3
  •  0
  •   raven    16 年前

    在devx.com上有一个关于这个错误的讨论,它似乎表明这个问题是由微软的脚本运行时(scrun.dll)引起的。

    FileSystemObject compatibility Unexpected error (32810)

    你的dll引用了那个库吗?如果是这样,您是否可以删除引用(例如,用内部的vb文件处理函数和/或api调用替换filesystemobject功能)。

        4
  •  0
  •   jasonk    16 年前

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

    *经验 *VBW *LIB

        5
  •  0
  •   wqw    7 年前
    ---------------------------
    Microsoft Visual Basic
    ---------------------------
    Unexpected error (32810)
    ---------------------------
    OK   Помощ   
    ---------------------------
    

    这是我试图在vbide中引用的一条消息,一个最近重新编译的旧OCX。

    经过长时间的研究,导致这个错误的代码行似乎是

    Property Get MouseActivate() As BookmarkEnum
    

    刚把这个改成

    Property Get MouseActivate() As Boolean
    

    。…错误就消失了。

    BookmarkEnum 是ADO的枚举。我们的构建服务器是Server2003,我的开发机器是Win10。该项目引用ADO 2.8,但显然这个类型库在Server2003和Win10上有一些不同。