我正在使用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的区别是什么。
谢谢。
就funcA()
而言,给AnsiString
分配一个char*
或一个UnicodeString
是绝对没有区别的。在这两种情况下,AnsiString
数据的内存表示是相同的。因此,无论您如何准备AnsiString
, funcA()
本身内部一定存在导致错误的问题。但是,如果不知道funcA()
实际做什么以及它期望得到什么输入,就无法诊断这个问题。你必须跟踪funcA()
内部的逻辑。
你说funcA()
来自第三方库。这到底是一个什么样的图书馆?它是静态链接LIB,还是外部DLL/BPL?这有很大的不同。如果它是一个外部DLL/BPL,那么你不能安全地传递非pod数据,如AnsiString
,在DLL边界上,除非DLL/BPL已经与你的EXE(在BPL的情况下,这也意味着在BPL和EXE项目中启用运行时包)完全相同的编译器,RTL和内存管理器进行编译。如果不是这样,那么很可能DLL/BPL正在使用不同的RTL/MM来解释内存中的AnsiString
数据,而不是您的EXE。AnsiString
的内存数据在CB2009中更改为包括新字段(即代码页和元素大小),因此,如果DLL/BPL在较早的编译器版本中编译,则当它试图从较新的编译器中使用AnsiString
时,可能会发生不好的事情(反之亦然)。
我想到的第一件事是String构造函数中没有AnsiString,因此没有办法将String类型分配给AnsiString。你没有提到编译器错误,所以听起来像编译器正在为你做一些错误的事情。
这篇文章如何将字符串转换为AnsiString提供了一种安全的方法。
基本上你需要在赋值中引用String变量char buffer,这样编译器才能做正确的事情。
这是一个较旧的Builder AnsiString引用(1997),提供了一些可能的构造函数和转换的信息。