2016-06-13 25 views
0

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では、単位レベルでInitializeFinalizeコールを宣言できますが、その構造体はC++ Builderでは使用されません。

System.UStrClrにエラーが発生する理由についてのご意見はありますか?あなたはこれをより深く理解するためにどこに掘り起こしますか?あなたが使用することを選択しない場合

class SomeClass { 
    static String SOME_STATIC_STRING; 
}; 

String SomeClass::SOME_STATIC_STRING("foo"); 

.hファイル:SO上の多数の他の記事で言及し、静的初期化子fiascosに関連

+1

ユーザー定義のエントリポイントより前に実行されるコードは通常静的初期化子であり、アクセス違反は静的オブジェクトの初期化の定義されていない順序の結果よりも頻繁に発生します。 'Attributebitmaps'クラスは初期化される他の静的オブジェクトに依存しますか? – IInspectable

+1

'Attributebitmaps'には' UnicodeString'メンバーがありますか? 'UStrClr()'はRTLの関数で、UnicodeString変数のメモリを解放します。だから、 'UnicodeString'変数が解放される前に壊れているか、あるいは呼び出しスタック自体が壊れていて、偶然に' UStrClr() 'にジャンプしています。いずれにせよ、実際のコードを見ることなく、これを対角化する方法はありません。 –

+0

'Attributebitmaps'には' UnicodeString'メンバがありません。 'TCanvas'といくつかの関連するVCLクラスに依存しますが、どんな種類の' String'メンバーもありません。しかし、ヒントをありがとう。探し続けるだけです。 – Ryan

答えて

0

が、この場合、犯人は以下のパターンでしたこのような初期化子は、.cppファイルに移動する必要があります。