首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++ builder中调用UnicodeString与AnsiString和AnsiString的区别

在C++ builder中调用UnicodeString与AnsiString和AnsiString的区别
EN

Stack Overflow用户
提问于 2013-01-09 06:58:12
回答 2查看 1.6K关注 0票数 0

我正在使用C++生成器XE3,我遇到了一个关于AnsiString的奇怪的问题。

请看下面的代码

代码语言:javascript
复制
//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有什么不同。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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时,可能会发生不好的事情(反之亦然)。

票数 2
EN

Stack Overflow用户

发布于 2013-01-09 07:25:20

我想到的第一件事是,没有AnsiString from String构造函数,因此无法将String类型分配给AnsiString。你没有提到编译器错误,所以听起来像是编译器为你做了一些错误的事情。

这篇文章的How to convert String to AnsiString提供了一种安全地实现这一点的方法。

基本上,你需要在赋值中引用字符串变量char buffer,这样编译器才能做正确的事情。

这是一个older Builder AnsiString reference (1997),它提供了一些可能的构造函数和转换的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14225516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档