CG错误
已加载两个不同的CRTLDLL。CG可能会报告虚假错误 (C:\ Windows \ system32 \ CC32100MT.DLL) (D:\ Projects \ Foo \ Bar.bpl)
好的
我理解为加载了两个不同的运行时库-一个是正确的(CC32100MT.dll),另一个是错误的,这是我们正在尝试使用的包。
继续运行程序会显示奇怪的错误,特别是在跨越EXE / DLL边界的方法中将类之间进行强制转换或将类的指针作为参数传递。 但Codeguard本身并没有显示任何其他错误。
我们该如何解决这个问题?
一些更多的细节
我们已经看了很多东西,我们(开发人员和我)可以共同思考:
每个项目都使用运行时包进行构建。 EXE主机在其包列表中列出了Bar。
每个项目都设置为使用动态RTL进行编译。但更改此设置并不能解决问题。
该包通过其BPI文件与EXE链接,但通过LIB进行链接也没有任何区别。
EXE和BPL使用相同的项目设置进行编译,两种类型的项目都存在相同的选项。我们认为是这样的 :)
系统上只有一个BPL和BPI副本:它肯定连接到正确的副本。
使用
Depends
和TDump
检查EXE和BPL,显示它们都正在使用C:\ Windows \ system32 \ CC32100MT.DLL
。它们应该都使用同一个RTL。创建一个新项目(纯VCL窗体应用程序)并通过其BPI链接到BPL可以正常工作。添加所有文件和LIB的过程中使我们的EXE包含所需代码的过程中发生了一些变化,但我们无法弄清楚原因。
LIBs都对应于我们使用的DLL(平坦的C接口,通常看起来像是使用MSVC构建的),或者是具有许多相关文件的简单项目,编译为lib以便链接到EXE中 - 顺便说一下,这些大致对应于我们想要拆分为BPL的程序区域。除非我们错过了它们,否则不会影响RTL链接的LIB项目的项目选项。
我已经在
Depends
中进行了详尽的搜索,并查看了EXE和每个DLL引用的所有RTL和CC32 * .dll文件。所有内容都是相同的:rtl140.bpl和CC32100MT.DLL。完全限定的路径显示它们是相同的文件。一切都应该使用同一个运行时库。
也许另一个问题是,为什么一个包会有自己的RTL,或者什么会使它被Codeguard视为“一个RTL DLL”呢?
我们陷入了困境。非常困惑。我们在使用BPL时遇到了其他问题(特别是使用C++时似乎非常棘手),但我们已经成功解决了所有问题。这一个我们完全没有进展,我们真的很感激任何见解 :)
我们正在使用C++Builder 2010(实际上是RAD Studio的一部分,但除了组件之外几乎没有Delphi代码)。
编辑: 开始了一项悬赏。我真的想解决这个问题!
编辑2: 感谢David Dean的帮助(在下面标记为已回答)。通过电子邮件,他指出这个问题由其他人在一个简单的测试案例中复制,并在Embarcadero QC上作为报告86335记录。目前还没有修复,但警告似乎并不表示有真正的问题(即,它很可能是一个虚假的错误,虽然运行时必须点击过对话框,但希望错误中没有什么可担心的东西。)