代码之家  ›  专栏  ›  技术社区  ›  David Mohaimin Moin

在C++ Cuilder 2010中使用包时,如何解决“加载两个不同的CRTLDLL”?

  •  4
  • David Mohaimin Moin  · 技术社区  · 14 年前

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

    CG Error
    
    Two different CRTLDLLs are loaded. CG might report false errors
    (C:\Windows\system32\CC32100MT.DLL)
    (D:\Projects\Foo\Bar.bpl)
    
    OK   

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

    我们怎么解决这个问题?

    我们已经研究了我们(从事此项工作的开发人员和我)能想到的所有事情:

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

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

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

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

    • 检查EXE和BPL Depends TDump C:\Windows\system32\CC32100MT.DLL . 他们 应该

    • 创建一个新项目(一个普通的VCL表单应用程序)并链接到BPL(通过它的BPI)工作得很好。在添加所有文件和lib的过程中,我们的EXE包含了它所需要的代码来改变这一点,但是我们还没有弄清楚是什么。

      • 我已经穷尽了 视情况而定 并查看了所有RTL和CC32*.dll文件的EXE和每个单独的dll引用。全部相同:rtl140.bpl和CC32100MT.DLL。完全限定路径也显示它们是相同的文件。一切都应该使用同一个运行时库。

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

    我们被难住了。完全被难住了。我们使用BPLS(还有一些棘手的事情,特别是使用C++),但已经解决了所有问题。这一次我们一点运气都没有,我们真的很感激有任何见解:)

    我们使用的是C++builder2010(实际上是RAD Studio的一部分,但是除了组件之外,只有很少的Delphi代码)

    编辑:

    编辑2: 感谢 David Dean Embarcadero QC as report 86335 . 目前没有修复程序,但警告似乎并不表示存在真正的问题(即,它是 可能 这是一个伪错误,虽然在运行时不得不单击对话框是一个遗憾,但希望错误中没有什么可担心的。)

    4 回复  |  直到 7 年前
        1
  •  1
  •   David Dean    14 年前

        2
  •  1
  •   Carl    14 年前

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

    <Multithreaded>true</Multithreaded>
    

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

        3
  •  1
  •   test    14 年前

    你有没有检查过你是否使用了\u TCHAR作为字符。我们在RAD Studio中遇到了一些类似的问题,我们找到了一个使用\u TCHAR作为char的解决方法。一旦用wchar\t编译了一个DLL或BPL项目,就会出现这个代码保护错误。

    我们还发现,可以使用TCHAR=wchar\t编译EXE项目,而不会出现任何问题(主函数将非常广泛)。

        4
  •  1
  •   David Dean    14 年前

    一位客户在我们的公共网站上记录了一个类似的案例 bug tracking system