gpt4 book ai didi

c++ - 在 C++ 构建器中从 Unicode 字符串传输的 AnsiString 和 AnsiString 的区别

转载 作者:行者123 更新时间:2023-11-28 03:25:24 24 4
gpt4 key购买 nike

我正在使用 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 中显示消息时没有区别。我完全不明白为什么两次调用了我不同的结果。

funcA 来自第三个库,代码有点复杂。所以在我跟踪这个库的代码之前,我想我应该知道 Code1 和 Code2 有什么区别。

谢谢。

最佳答案

至于funcA()char*而言,绝对没有区别或 UnicodeString被分配给了AnsiString . AnsiString 的内存表示两种情况下的数据相同。所以funcA()里面一定有问题本身就是导致错误的原因,无论您如何准备 AnsiString .但不知道是什么funcA()实际上做了什么以及它期望什么输入,没有办法诊断这个问题。你将不得不追踪 funcA() 内部的逻辑.

你说 funcA()来自第三方库。它到底是一个什么样的图书馆?它是静态链接的 LIB,还是外部 DLL/BPL?这有很大的不同。如果它是一个外部 DLL/BPL,那么你不能安全地传递非 POD 数据,比如 AnsiString , 在 DLL 边界上,除非 DLL/BPL 是使用与 EXE 完全相同的编译器、RTL 和内存管理器编译的(在 BPL 的情况下,这也意味着在 BPL 和 EXE 项目中启用运行时包)。如果不是这种情况,那么 DLL/BPL 可能使用不同的 RTL/MM 来解释内存中的 AnsiString。与您的 EXE 不同的数据。 AnsiString 的内存数据在 CB2009 中更改为包含新字段(即代码页和元素大小),因此如果 DLL/BPL 是在早期编译器版本中编译的,则当它尝试使用 AnsiString 时可能会发生不好的事情。来自较新的编译器(反之亦然)。

关于c++ - 在 C++ 构建器中从 Unicode 字符串传输的 AnsiString 和 AnsiString 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14225516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com