我正在使用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);
超出我的想象,它第一次运行良好,但是第二次抛出“格式错误”异常。甚至我只用Code 2调用过funcA,问题仍然存在。
因为当我在temp1或temp2中使用ShowMessage时没有区别。我完全不明白为什么两次通话给我不同的结果。
funcA来自第3个库,带有一些复杂的代码。因此,在跟踪该库的代码之前,我想我应该知道Code1和Code2有什么区别。
谢谢。
最佳答案
就funcA()
而言,将char*
或UnicodeString
分配给AnsiString
绝对没有区别。在两种情况下,AnsiString
数据在内存中的表示都是相同的。因此,无论您如何准备funcA()
,在AnsiString
本身内部都必须存在一个导致错误的问题。但是,如果不知道funcA()
的实际作用和期望输入的内容,就无法诊断此问题。您将必须跟踪funcA()
内部的逻辑。
您说funcA()
来自第三方库。到底是什么样的图书馆?它是静态链接的LIB,还是外部DLL / BPL?这有很大的不同。如果它是外部DLL / BPL,则除非在使用EXACT SAME编译器,RTL和内存管理器作为编译器的情况下编译DLL / BPL,否则无法安全地在DLL边界上传递非数据,例如AnsiString
。 EXE(对于BPL,这还意味着在BPL和EXE项目中都启用运行时包)。如果不是这种情况,则DLL / BPL可能使用的RTL / MM与EXE所使用的RTL / MM的解释不同。 AnsiString
的内存数据在CB2009中进行了更改,以包括新字段(即代码页和元素大小),因此,如果DLL / BPL是在较早的编译器版本中编译的,则当它尝试使用较新的编译器中的AnsiString
(反之亦然)。
关于c++ - 与C++ Builder中从Unicode字符串传输的AnsiString和AnsiString的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14225516/