我有一个非常奇怪的错误,任何人都可以在这上面的任何亮点都将非常感激。
我对一些构建COM对象的VB6源做了一些更改。构建我们的应用程序的自动构建返回了一个错误。没问题我想 - 我会退出我的改变。好吧退出我的更改并没有让问题消失。
特别是当我尝试通过.vbg文件构建应用程序时,使用命令行path\to\vb6\vb6 ProjectFile.vbg /make
我收到了一条消息
“编译文件中的错误”,行:对象库 无效或包含对无法定义的对象定义的引用 找到。“
正如我所说,我还原了源代码,所以我真的很难过为什么这个错误仍在发生。任何VB6大师都可以指点我的答案?
我可以发布有问题的确切代码,但事实上它正确构建,停止正确构建并且现在拒绝正确构建使我认为这不是我的代码的问题,而是环境中的一些问题。就像之前的构建错误导致注册表中的内容一样。
任何提示,提示或建议都非常欢迎。我意识到我的问题有点粗略,但我甚至不确定包含什么和不包含什么是重要的。
编辑1:
感谢各位出色的建议。我认为这与VB6进行某种自动注册有关。
只是添加更多细节:当我从IDE构建引用的vbp文件时,不会发生此问题。它只发生在包含vbp的.vbg上的make上。此外,相关的构建工具会自动提取最新的源代码,并且错误会在我的本地框和专用构建框中发生。
编辑2:
大家好,
发布工程师发现了如何在他的构建环境中构建它,所以它目前还可以。一旦我们度过了这个危机,我会试着询问他所做的事情并与大家分享细节。
再次感谢所有伟大的建议。这就是SO的优点;也就是说,我询问了一项已有10年历史的技术,并且我得到了一些非常棒的想法。
答案 0 :(得分:5)
确保VBG和所有VBP也被回滚。该错误与尝试引用不再对依赖项有效的CLSID的项目一致。您是否尝试加载项目组并从IDE构建,如果可行,并且您保存并检入对组和项目文件的所有更改,则可能已修复。
答案 1 :(得分:1)
我猜你提到它是一个COM组件可能是问题的根源。如果任何公共方法或属性已经改变,那么我似乎记得VB6将改变界面GUID 和自动注册新的。
我的建议是检查注册表以查找组件名称的任何提及,记下任何关联的CLSID,备份注册表,然后删除引用。
正如cmsjr所提到的那样,你的.vbp文件中也可能是一个糟糕的CLSID引用。
另一个选择是失败导致某些.tlb(类型库)或olb(对象库)文件出现问题。
答案 2 :(得分:1)
最好的办法是将所有兼容性DLL移动到单独的组合目录中。这样做的原因是控制VB6用于检查二进制兼容性的内容。此外,生成的Typelib导入引用。因此,如果您使用二进制DLL Ver 10进行兼容性,但是导入是在二进制DLL Ver 9中引入的,那么您将遇到问题。通过将所有库保存在单个文件夹中并将项目指向该文件夹中的DLL,可以确保相应的TypeLib导入正确的版本。
最后,如果你有多个级别的DLL相互引用。您可能遇到神秘的错误,VB6无法使用二进制兼容性进行编译。在这种情况下,您需要编译层次结构中的最低DLL(可能是Utility DLL)将其复制到兼容性文件夹中。沿着链条前进,直到所有内容再次编译完成。
这是因为如果有一个引用DLL C的VB引用DLL B,如果你对A和C进行了更改,有时会感到困惑。编译正常但A不会更新兼容库。
答案 3 :(得分:0)
查看并删除任何可能位于上一个失败版本中的.obj和.exp文件。
答案 4 :(得分:0)
你必须打开项目&重新键入您更改的行。
将项目与VBG一起保存,然后重新编译。
我认为这会解决它。
编辑:想法是cls / bas文件记住你使用的类(CLSID)。因此,如果您更改引用但不更改cls / bas中的行 - 它是类型不匹配(引用的内容与cls / bas文件中键入的内容)。