首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

关于 char * 与 AnsiString 的DLL函数返回值!解决思路

2012-03-29 
关于 char * 与 AnsiString 的DLL函数返回值!从一个DLL中调用另一个DLL的字符串返回值,两个DLL均用C++Buil

关于 char * 与 AnsiString 的DLL函数返回值!
从一个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   返回的正确,这是为何?




[解决办法]
C++ Builder 2006 SP2 测试以上两个函数,都得到了正确的返回值,未发生楼主所遇到的情况
只有帮顶了
[解决办法]
看看C++ Builder 2006本身有没有问题!
[解决办法]
char * __stdcall ReadString(void)
{
S.SetLength(10);
S = "12345 ";
return S.c_str();
}

[解决办法]
通过char *s=ReadString(void);取到的字符串地址很难说是否已经被AnsiString给搬到别的地方去了. 象vector一样, AnsiString是通过重新申请内存来扩充内存的

[解决办法]
AnsiString 是引用計數方式的字符串。如果放到線程中,則根本不能保證 c_str()的值。
但是返回 AnsiString 的時候,卻能保障引用計數的正確性。

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

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


[解决办法]
还有
AnsiString SS = ReadString(); // SS == "12345 "
FreeLibrary();
SS ==> 后果难料
[解决办法]
ding!

热点排行