使用 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
函数执行一些数字操作 - 没有任何类型的String依赖项。
Attributebitmaps
是一个静态类,没有名为Initialize
的成员。在Delphi中,您可以在单元级别声明Initialize
和Finalize
调用,但在C ++ Builder中不使用该构造。
有关System.UStrClr
错误发生原因的任何想法?您将在哪里挖掘以更深入地了解这一点?
答案 0 :(得分:0)
与SO上的许多其他帖子中提到的静态初始化器fiascos相关,在这种情况下的罪魁祸首是以下模式:
.h
档案:
class SomeClass {
static String SOME_STATIC_STRING;
};
String SomeClass::SOME_STATIC_STRING("foo");
如果您确实选择使用这样的初始化程序,则应将其移至.cpp
文件。