关于 char * 与 AnsiString 的DLL函数返回值!

sczyq 2007-04-21 09:09:49
从一个DLL中调用另一个DLL的字符串返回值,

两个DLL均用C++Builder 2006编写。

==============================================

采用 char * 返回时,

AnsiString S

char * __stdcall ReadString(void)
{
S = "12345";
return S.c_str();
}


调用后,

AnsiString SS = ReadString(); // SS == "1234"

==============================================

采用 AnsiString 返回时,

AnsiString S

AnsiString __stdcall ReadString(void)
{
S = "12345";
return S;
}


调用后,

AnsiString SS = ReadString(); // SS == "12345"

==============================================

反而采用AnsiString 返回的正确,这是为何?















...全文
278 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
过客猫2022 2007-04-24
  • 打赏
  • 举报
回复
ding!
FFSB 2007-04-24
  • 打赏
  • 举报
回复
还有
AnsiString SS = ReadString(); // SS == "12345"
FreeLibrary();
SS ==>后果难料
FFSB 2007-04-24
  • 打赏
  • 举报
回复
LS完全正确
勉励前行 2007-04-24
  • 打赏
  • 举报
回复
AnsiString 是引用計數方式的字符串。如果放到線程中,則根本不能保證 c_str()的值。
但是返回 AnsiString 的時候,卻能保障引用計數的正確性。

如果不想使用引用計數方式,那就用 std::string 效率也比 AnsiString 好。

在單線程程序中,應該不會出現樓主所說情況。

northsoft_ 2007-04-24
  • 打赏
  • 举报
回复
DLL中尽量不要使用vcl
Waiting4you 2007-04-24
  • 打赏
  • 举报
回复
通过char *s=ReadString(void);取到的字符串地址很难说是否已经被AnsiString给搬到别的地方去了. 象vector一样, AnsiString是通过重新申请内存来扩充内存的
痞子酷 2007-04-24
  • 打赏
  • 举报
回复
char * __stdcall ReadString(void)
{
S.SetLength(10);
S = "12345";
return S.c_str();
}
CsharpGame 2007-04-21
  • 打赏
  • 举报
回复
看看C++ Builder 2006本身有没有问题!
___NULL 2007-04-21
  • 打赏
  • 举报
回复
C++ Builder 2006 SP2 测试以上两个函数,都得到了正确的返回值,未发生楼主所遇到的情况
只有帮顶了
sczyq 2007-04-21
  • 打赏
  • 举报
回复
也就是采用 char * 方式调用时,总会丢失最后一个字符!

13,822

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧