DLL接口里返回CHAR*的问题

LWLIFE 2012-09-17 09:09:09
需要给别人提供一个DLL,返回的类型是CHAR*,尝试过以下几种方法
1定义一个返回变量char cres[1024]返回cres即可,但是这样一量返回的长度超过1024就会切断
2使用AnsiString(UnicodeString)变量sRes,返回c_str(t.str)也可以,但是这样的方法,接收的人经常后面就会少几位,请问怎么解决好呢?此种方法怎么样才能让后面不少?
...全文
433 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LWLIFE 2012-09-17
  • 打赏
  • 举报
回复
O,这样呀,谢谢回复
勉励前行 2012-09-17
  • 打赏
  • 举报
回复
1、Dll中定义一个全局变量 AnsiString PublicBuff, 返回PublicBuff.c_str()即可.
如果不是全局变量,接收的人少几个字节很正常。但因为是全局变量,也就不支持多线程了。

2、支持多线程的话,需要规范,即规范好谁分配内存,谁释放。可以在DLL中放一个接口,deletePCHARinDLL(char *),由调用者负责delete,即谁调用,谁调用deletePCHARinDLL来清场。

3、另一种规范是,DLL标明用户必须自行保障有足够的空间。使用者可以先调用DLL中的函数,取得字串长度,再由使用者申请内存。

你说的情况,只能是第1种,DLL中用全局变量或局部静态变量来实现。
LWLIFE 2012-09-17
  • 打赏
  • 举报
回复
呵呵,现在发现这样的问题也挺不爽,没办法呀,呵呵。
缘中人 2012-09-17
  • 打赏
  • 举报
回复
char* 就得用c_str();

或者在你的函数里这样改下试试
char buf[2048];
return buf

返回char*真麻烦
LWLIFE 2012-09-17
  • 打赏
  • 举报
回复
这种方式,不分配空间了
这里不的分配空间了什么意思?现在C#就是s=fun();后,我返回的是123,结果s变成了12少了后面的。
另外 使用c_str(),t_str()这样的方法有没有什么解决办法的,感觉这样灵活一些
缘中人 2012-09-17
  • 打赏
  • 举报
回复
调用这c#也无妨,就用
String s;
s = fun();
这种方式,不分配空间了,要分配就分配大一些例如[10000]
LWLIFE 2012-09-17
  • 打赏
  • 举报
回复
调用的是C#,并且在我问题1里也说了,如果定义一个1024,一旦返回值超过1024那一样数据会有丢失了。
缘中人 2012-09-17
  • 打赏
  • 举报
回复
调用这如果是c++builder;

String s;
s = fun();
或者
char buf[1024]={0};
strcpy(buf,fun());
把这个返回值复制出来。就安全了。否则下次访问值可能变化。
LWLIFE 2012-09-17
  • 打赏
  • 举报
回复
呵呵,谢谢回复,思路不错,以后会采用。
我这个接口以经提供使用好久了,最近发现这样的问题,类型不能改了,有什么办法解决吗?
缘中人 2012-09-17
  • 打赏
  • 举报
回复
我一般不返回char*
函数返回值为int类型。
int fun( ..... ,char * cres)
让调用这分配空间,用完后调用者释放空间。

13,825

社区成员

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

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