RAD Studio 10.1 Berlinを使用して、古いデスクトップアプリケーションを現代に移植する。アプリケーションはC++ Builder 6で最後にビルドされました(数多くの月前)。System.UStrClrアクセス違反
すべてのコンポーネントと外部ライブラリの依存関係を整理するために管理されていましたが、Unicodeポートで長引く問題があるようです。アプリは内蔵のString
タイプに大きく依存していましたが、現在はAnsiString
に対応しています。
ソースコードはビルドされていますが、バイナリはアプリケーションコードが実行される前にどこかでアクセス違反をスローします。エラースタックトレース:
[email protected]@@UstrClr$qqrpv + 0x12
largest_pos
__linkproc__ Attributebitmaps::Initialize 0x18
__init_exit_proc
__wstartup
largest_pos
関数は数値操作を行いますが、どのような種類の文字列依存関係もありません。
Attributebitmaps
は、静的なクラスであり、メンバーはInitialize
と呼ばれません。 Delphiでは、単位レベルでInitialize
とFinalize
コールを宣言できますが、その構造体はC++ Builderでは使用されません。
System.UStrClr
にエラーが発生する理由についてのご意見はありますか?あなたはこれをより深く理解するためにどこに掘り起こしますか?あなたが使用することを選択しない場合
class SomeClass {
static String SOME_STATIC_STRING;
};
String SomeClass::SOME_STATIC_STRING("foo");
:
.h
ファイル:SO上の多数の他の記事で言及し、静的初期化子fiascosに関連
ユーザー定義のエントリポイントより前に実行されるコードは通常静的初期化子であり、アクセス違反は静的オブジェクトの初期化の定義されていない順序の結果よりも頻繁に発生します。 'Attributebitmaps'クラスは初期化される他の静的オブジェクトに依存しますか? – IInspectable
'Attributebitmaps'には' UnicodeString'メンバーがありますか? 'UStrClr()'はRTLの関数で、UnicodeString変数のメモリを解放します。だから、 'UnicodeString'変数が解放される前に壊れているか、あるいは呼び出しスタック自体が壊れていて、偶然に' UStrClr() 'にジャンプしています。いずれにせよ、実際のコードを見ることなく、これを対角化する方法はありません。 –
'Attributebitmaps'には' UnicodeString'メンバがありません。 'TCanvas'といくつかの関連するVCLクラスに依存しますが、どんな種類の' String'メンバーもありません。しかし、ヒントをありがとう。探し続けるだけです。 – Ryan