System.UStrClr 访问冲突

System.UStrClr Access Violation

使用 RAD Studio 10.1 Berlin 将旧桌面应用程序移植到现代。应用程序最后一次使用 C++ Builder 6 构建(很久很久以前)。

设法解决了所有组件和外部库的依赖关系,但似乎 Unicode 端口存在一些挥之不去的问题。该应用程序以前严重依赖内置 String 类型,现在对应 AnsiString.

源代码已构建,但二进制文件在执行任何应用程序代码之前在某处抛出访问冲突。错误堆栈跟踪:

rtl240.@System@@UstrClr$qqrpv + 0x12
largest_pos
__linkproc__ Attributebitmaps::Initialize 0x18
__init_exit_proc
__wstartup

largest_pos 函数执行一些数值操作 - 没有任何类型的字符串依赖性。

Attributebitmaps 是一个静态 class,没有名为 Initialize 的成员。在 Delphi 中,您可以在单元级别声明 InitializeFinalize 调用,但 C++ Builder 中不使用该构造。

关于 System.UStrClr 中为什么会发生错误的任何想法?您会去哪里挖掘以更深入地了解这一点?

与 SO 上许多其他帖子中提到的静态初始化程序失败相关,这种情况的罪魁祸首是以下模式:

.h 文件:

class SomeClass {
    static String SOME_STATIC_STRING;
};

String SomeClass::SOME_STATIC_STRING("foo");

如果您确实选择使用这样的初始化程序,则应将其移至 .cpp 文件。