AnsiString和AnsiString在c++ builder中从UnicodeString转换而来的区别

Diffence with AnsiString and AnsiString transfered from UnicodeString in C++ builder

本文关键字:AnsiString 区别 转换 中从 c++ builder UnicodeString      更新时间:2023-10-16

我正在使用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),提供了一些可能的构造函数和转换的信息。