4

我们正在尝试将我们的整体 EXE 拆分为一个 EXE 和几个包的组合。到目前为止,我们有一个我们正在尝试使用的包,并且在运行 EXE Codeguard 时在启动时显示以下错误:

重心错误

加载了两个不同的 CRTLDLL。CG 可能会报告错误的错误
(C:\Windows\system32\CC32100MT.DLL)
(D:\Projects\Foo\Bar.bpl)

好的   

我将其读取为两个不同的运行时库正在加载 - 一个是正确的(CC32100MT.dll),一个是不正确的,这是我们正在尝试使用的包。

继续运行程序会显示奇怪的错误,尤其是在类之间进行转换或将指向类的指针作为参数传递给跨越 EXE/DLL 边界的方法。Codeguard 本身根本不显示任何其他错误。 编辑:这现在已经解决,并且不相关。该程序似乎运行正常,但 Codeguard 显示的警告仍然令人担忧。

我们如何解决这个问题?

更多细节

我们已经研究了我们(开发人员和我)可以集体想到的尽可能多的事情:

  • 每个项目都是使用运行时包构建的。EXE 主机在其包列表中列出了 Bar。

  • 每个项目都设置为使用动态 RTL 进行编译。但是,改变这一点并不能解决问题。

  • 该包通过其 BPI 文件链接到 EXE,但通过 LIB 链接也没有区别。

  • EXE 和 BPL 使用相同的项目设置进行编译,其中两种类型的项目存在相同的选项。无论如何,我们认为:)

  • 系统上只有一份 BPL 和 BPI 副本:它肯定链接到正确的副本。

  • 检查 EXE 和 BPLDependsTDump显示它们都在使用C:\Windows\system32\CC32100MT.DLL. 他们都应该使用一个 RTL。

  • 创建一个新项目(一个普通的 VCL 表单应用程序)并链接到 BPL(通过它的 BPI)工作正常。在添加所有文件和 LIB 的过程中,使我们的 EXE 包含更改它所需的代码,但我们无法弄清楚是什么。

    • LIB 要么对应于我们使用的 DLL(平面 C 接口,通常看起来好像它们是用 MSVC 构建的),要么是具有大量相关文件的简单项目,为了链接到 EXE 而编译到 lib - 这些大致对应顺便说一下,到我们想要拆分为 BPL 的程序区域。LIB 项目似乎没有会影响 RTL 链接的项目选项,除非我们错过了它们。

    • 我已经详尽地Depends搜索并查看了 EXE 和每个 DLL 引用的所有 RTL 和 CC32*.dll 文件。全部相同:rtl140.bpl 和 CC32100MT.DLL。完全限定的路径也表明它们是相同的文件。一切都应该使用同一个运行时库。

编辑:最终的 EXE 很复杂,用几个库、几个 DLL 等构建。所有这些,当用 C++Builder 构建时,都是用当前版本构建的。这些 DLL 或 LIB 之一中是否有可能导致问题的东西?我对 RTL 的链接方式知之甚少,无法确定在哪里查看……我的(天真?)假设是链接器通常会链接到一组 RTL 函数中,但这当然不会似乎正在发生......而且我不知道使用包时事情会如何变化。是否有可能这个错误一直存在并且 Codeguard 之前没有标记它,因为我们没有使用像包这样的动态东西?

也许另一个问题是,为什么一个包会有它自己的 RTL,或者是什么让它算作 Codeguard 的“RTL DLL”?

我们很难过。绝对难倒。我们在使用 BPL 时遇到了其他问题(它们似乎是非常棘手的事情,尤其是使用 C++),但已经设法解决了所有问题。我们完全没有运气,我们非常感谢任何见解:)

我们使用的是 C++Builder 2010(实际上是 RAD Studio 的一部分,但除了组件之外几乎没有 Delphi 代码。)

编辑:开始赏金。我真的很想解决这个问题!

编辑 2:感谢David Dean的帮助(标记如下。)通过电子邮件,他指出这个问题是由其他人在一个简单的测试用例中复制的,并在Embarcadero QC 中作为报告 86335 登录。目前没有修复,但警告似乎并不表示真正的问题(即,它可能是一个虚假错误,虽然很遗憾在运行时必须点击对话框,但希望错误中没有什么可担心的关于。)

4

4 回答 4

1

由于其中一个来自 .bpl,您是否尝试在项目选项中关闭“使用运行时包构建”?

于 2010-07-01T14:56:33.857 回答
1

我们遇到了类似的问题。我们将其追踪到一个(非 VCL).cbproj,它是在没有“多线程”选项的情况下创建的。

据我所知,您唯一有机会设置此选项是在创建新的 .cbproj 时,之后无法使用 GUI 更改它。我们最终“破解”了 .cbproj 以包括以下内容:

<Multithreaded>true</Multithreaded>

要确定导致问题的 dll,它应该是在您看到 CG 消息之前在输出窗口中加载的最后一个 dll。

于 2010-07-07T09:04:17.443 回答
1

您是否检查过您是否使用 _TCHAR 作为字符。我们在使用 RAD Studio 时遇到了一些类似的问题,我们找到了一种使用 _TCHAR 作为 char 的解决方法。一旦使用 wchar_t 编译了一个 DLL 或 BPL 项目,就会出现此代码保护错误。

我们还发现,使用 TCHAR = wchar_t 可以毫无问题地编译 EXE 项目(主函数将是 WIDE)。

这些设置不会影响 GUI 能够处理 UNICODE。

于 2010-07-24T18:42:24.477 回答
1

一位客户在我们的公共错误跟踪系统中记录了一个类似的案例,该错误已在最新版本中确定并修复。

于 2010-09-02T16:10:36.277 回答