0

C++ Builder XE3 を使用していますが、AnsiString で奇妙な問題に遭遇しました。

以下のコードを見てください

//Code 1: first time
AnsiString temp1 = "test" ;
funcA(temp1,temp1);

//Code 2: second time    
String uTemp2 = "test";
AnsiString temp2 = uTemp2;
funcA(temp2,temp2);

私の想像では、最初はうまくいきますが、2回目には「Bad Format」例外がスローされます。そして、コード 2 で一度 funcA を呼び出しただけでも、問題は残りました。

temp1またはtemp2内でShowMessageを実行しても違いはありません。2回の呼び出しで異なる結果が得られた理由がまったくわかりません。

funcA は、少し複雑なコードを持つ 3 番目のライブラリからのものです。したがって、このライブラリのコードをたどる前に、Code1 と Code2 の違いを知っておく必要があると思います。

ありがとう。

4

2 に答える 2

2

に関する限り、 aまたは aが に割り当てられたfuncA()かどうかにまったく違いはありません。どちらの場合も、データのメモリ内表現は同じです。そのため、. しかし、実際に何が行われ、どのような入力が期待されるかを知らなければ、この問題を診断する方法はありません。内のロジックをトレースする必要があります。char*UnicodeStringAnsiStringAnsiStringfuncA()AnsiStringfuncA()funcA()

あなたはfuncA()、サードパーティのライブラリから来ていると言います。具体的にはどのような図書館ですか?静的にリンクされた LIB ですか、それとも外部 DLL/BPL ですか? それは大きな違いを生みます。外部 DLL/BPL のAnsiString場合、DLL/BPL が EXACT SAME コンパイラ、RTL、およびメモリ マネージャを使用して EXE (これは、BPL と EXE プロジェクトの両方でランタイム パッケージを有効にすることも意味します)。そうでない場合、DLL/BPL は、メモリ内AnsiStringデータを EXE とは異なる方法で解釈する別の RTL/MM を使用している可能性があります。のメモリ内データAnsiStringCB2009 で新しいフィールド (コードページと要素サイズ) を含めるように変更されたため、DLL/BPL が以前のバージョンのコンパイラでコンパイルされた場合AnsiString、新しいコンパイラの を使用しようとすると問題が発生する可能性があります (逆も同様です)。 )。

于 2013-01-08T23:56:43.040 に答える
0

最初に思いついたのは、AnsiString from String コンストラクターがないため、String 型を AnsiString に割り当てる方法がないということです。あなたはコンパイラエラーについて言及していないので、コンパイラが何か間違ったことをしているように聞こえます。

この投稿How to convert String to AnsiStringは、安全に行う方法を提供します。

基本的に、コンパイラが正しいことを行うように、割り当てで文字列変数の char バッファーを参照する必要があります。

これは古いビルダー AnsiString リファレンス (1997 年)であり、可能なコンストラクターと変換に関する情報を提供します。

于 2013-01-08T23:25:19.960 に答える