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