我正在使用C++生成器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);出乎我的想象,它在第一次运行得很好,但是在第二次抛出了一个"Bad Format“异常。即使我只用代码2调用了funcA一次,问题仍然存在。
因为当我在temp1或temp2中使用ShowMessage时没有区别。我完全不能理解为什么两次通话给我不同的结果。
funcA来自第三个库,代码有点复杂。所以在我研究这个库的代码之前,我想我应该知道Code1和Code2有什么不同。
谢谢。
发布于 2013-01-09 07:56:43
就funcA()而言,无论是将char*还是UnicodeString分配给AnsiString,都完全没有区别。在这两种情况下,AnsiString数据的内存表示形式是相同的。因此,无论您如何准备AnsiString,都必须在funcA()内部存在导致错误的问题。但是如果不知道funcA()实际做了什么以及它期望的输入是什么,就没有办法诊断这个问题。您必须跟踪funcA()内部的逻辑。
你说funcA()来自第三方的库。它到底是一种什么样的库?它是静态链接的LIB,还是外部DLL/BPL?这会带来很大的不同。如果它是一个外部DLL/ BPL,那么你就不能安全地在DLL边界上传递非AnsiString数据,除非DLL/BPL是用与你的EXE完全相同的编译器、RTL和内存管理器编译的(对于BPL,这也意味着在BPL和EXE项目中启用运行时包)。如果不是这样,那么很可能DLL/BPL正在使用不同的RTL/MM,它解释内存中的AnsiString数据的方式与您的EXE不同。AnsiString的内存中数据在CB2009中被更改为包括新字段(即代码页和元素大小),因此,如果DLL/BPL是在较早的编译器版本中编译的,那么当它试图使用较新编译器中的AnsiString时,可能会发生不好的事情(反之亦然)。
发布于 2013-01-09 07:25:20
我想到的第一件事是,没有AnsiString from String构造函数,因此无法将String类型分配给AnsiString。你没有提到编译器错误,所以听起来像是编译器为你做了一些错误的事情。
这篇文章的How to convert String to AnsiString提供了一种安全地实现这一点的方法。
基本上,你需要在赋值中引用字符串变量char buffer,这样编译器才能做正确的事情。
这是一个older Builder AnsiString reference (1997),它提供了一些可能的构造函数和转换的信息。
https://stackoverflow.com/questions/14225516
复制相似问题