读书人

关于 char * 与 AnsiString 的DLL函数

发布时间: 2012-03-29 12:53:12 作者: rapoo

关于 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!

读书人网 >C++ Builder

热点推荐