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 调用了一次 funcA,问题仍然存在。

因为当我在 temp1 或 temp2 中 ShowMessage 时没有区别。我完全不明白为什么两次通话给了我不同的结果。

funcA 来自第三个库,代码有点复杂。所以在我追踪这个库的代码之前,我想我应该知道 Code1 和 Code2 有什么区别。

谢谢。

4

2 回答 2

2

funcA()目前而言,将 achar*或 aUnicodeString分配给AnsiString. 在这两种情况下,数据的内存表示AnsiString是相同的。因此funcA(),无论您如何准备AnsiString. 但是,如果不知道funcA()实际做了什么以及它期望什么输入,就无法诊断这个问题。您将不得不跟踪funcA().

你说funcA()来自第三方库。究竟是什么样的图书馆?它是静态链接的 LIB,还是外部 DLL/BPL?它有很大的不同。如果它是外部 DLL/BPL,那么您不能安全地通过AnsiStringDLL 边界传递非 POD 数据,除非 DLL/BPL 已使用 EXACT SAME 编译器、RTL 和内存管理器作为您的 EXE(在对于 BPL,这也意味着在 BPL 和 EXE 项目中启用运行时包)。如果不是这种情况,那么很可能 DLL/BPL 正在使用不同的 RTL/MM,它对内存中AnsiString数据的解释与您的 EXE 不同。内存中的数据AnsiString在 CB2009 中更改为包含新字段(即代码页和元素大小),因此如果 DLL/BPL 是在较早的编译器版本中编译的,则当它尝试使用AnsiString较新编译器中的)。

于 2013-01-08T23:56:43.040 回答
0

我首先想到的是 String 构造函数中没有 AnsiString,因此无法将 String 类型分配给 AnsiString。您没有提到编译器错误,因此听起来编译器正在为您做一些错误的事情。

这篇文章如何将字符串转换为 AnsiString提供了一种安全的方法。

基本上,您需要在赋值中引用字符串变量 char buffer,以便编译器做正确的事情。

这是一个较旧的 Builder AnsiString 参考资料 (1997),它提供了有关一些可能的构造函数和转换的信息。

于 2013-01-08T23:25:19.960 回答