我正在使用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/

10-11 16:28