DLL返回的字符串值

lirg8405 2009-07-21 07:16:59
我在DLL入口函数如下:
extern "C" __declspec(dllexport) bool __stdcall Pub_ExpressMath(char *Express,char * Value, bool Checkeds, int Division = 1)
{
TMathCalculated *Math;
String ExpressStr;
bool BReturn;

ExpressStr = Express;
if (ExpressStr == "")
{
ExpressStr = "0.00";
return true;
}
Math = new TMathCalculated(Express);
BReturn = Math->Pub_ExpressMath(ExpressStr, Checkeds, Division);
if (!BReturn)
{
ExpressStr = "0.00";
}
strcpy(Value,ExpressStr.c_str());

return BReturn;
}
然后调用接口如下:
String Express = Memo1->Text.Trim();
char *Result = "0.00";
if (MathDLL != NULL)
{
typedef bool (TPub_ExpressMath)(char *, char *, bool, int);
TPub_ExpressMath *Pub_ExpressMath;
Pub_ExpressMath = (TPub_ExpressMath *)GetProcAddress(MathDLL,"Pub_ExpressMath");
if (MathDLL != NULL)
{
Pub_ExpressMath(Express.c_str(),Result,true,1);
// Label1->Caption = "结果="+String(Result); //这样会出错,为什么?
ShowMessage(Result); //正确Show出
}
}
出错地方就是上面的Label中赋值,也就是搞不懂为什么在赋值时候出错,用SHOW的办法的话,可以Show出结果;如下调用也一样出错:
String Express = Memo1->Text.Trim();
char *Result = "0.00";
if (MathDLL != NULL)
{
typedef bool (TPub_ExpressMath)(char *, char *, bool, int);
TPub_ExpressMath *Pub_ExpressMath;
Pub_ExpressMath = (TPub_ExpressMath *)GetProcAddress(MathDLL,"Pub_ExpressMath");
if (MathDLL != NULL)
{
Pub_ExpressMath(Express.c_str(),Result,true,1);
Express = String(Result);
Label1->Caption = "结果="+Express; //这样会出错,为什么?
ShowMessage(Result); //正确Show出
}
}
各位老大帮看下,谢谢
...全文
205 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooip1919 2009-07-22
  • 打赏
  • 举报
回复
....
if (!BReturn)
{
ExpressStr = "0.00";
}
Value=new char[ExpressStr.Length()+1];
strcpy(Value,ExpressStr.c_str());

....
wtu_3205017 2009-07-22
  • 打赏
  • 举报
回复
AnsiString str = "0.00";

若DLL中 char *p = str.c_str();
strcpy(p, "0.0000");
则会产生内存溢出,0.0000的后两个0会覆盖其它部分的数据,其错误是不可预知的。
ooip1919 2009-07-22
  • 打赏
  • 举报
回复
strcpy(Value,ExpressStr.t_str());//用t_str()看看
Label1->Caption = "结果="+String(Value); //(String)Value也试试

用2009调试可以正确,LZ用的是CB6?

关于c_str()我实在头大,反正c_str()用不了我就用t_str(),懒得去想

LZ想弄清楚,可以参考下面连接:
http://topic.csdn.net/u/20080926/16/d32a96fe-8a3a-4e80-bb29-49ff00cb907b.html

大虾们说得我晕晕的
ccrun.com 2009-07-22
  • 打赏
  • 举报
回复
Label1->Caption = String().sprintf("结果=[%s]", p);


另外需要注意,App工程中,Pub_ExpressMath的声明形式,必须和Dll工程中声明的一致。
lirg8405 2009-07-22
  • 打赏
  • 举报
回复
值是可以返回了,但是怎样保存到字符串呢?我这样操作出错:
Label1->Caption = "结果=["+String(value)+"]"; //这样会出错,为什么?
但是ShowMessage(value);就没有错
ccrun.com 2009-07-22
  • 打赏
  • 举报
回复
2009中的String返回字符串指针有三种方式:

.t_str() 返回类型取决于工程选项中中TCHAR的映射,如果映射为char *,则返回char *,如果映射为wchar_t *则返回wchar_t *
.c_str() 返回wchar_t *,这个函数应该是出于兼容性的考虑
.w_str() 返回wchar_t *
FlySkyFree 2009-07-22
  • 打赏
  • 举报
回复
来学习了
lirg8405 2009-07-22
  • 打赏
  • 举报
回复
t_str()BCB6.0好像没有;这个真是麻烦,一般上以前是做传入的,现在做个计算器要返回的了就出问题了,这个真是个大问题呀,我不太熟悉这方面的处理,我用指针返回后,赋值给double不会错,但是连续处理多几次后,后出现意想不到的错误,也是内存方面的,啊,头大呀
lirg8405 2009-07-21
  • 打赏
  • 举报
回复
先谢谢老大,去洗澡回来再调试下
ccrun.com 2009-07-21
  • 打赏
  • 举报
回复
一定要注意上面的例子中参数的形式,传入的是一个指针的指针。
ccrun.com 2009-07-21
  • 打赏
  • 举报
回复
如果用第二种方法,需要修改一下,以下是个简单的例子:
在dll工程中:
extern "C" __declspec(dllexport)
bool __stdcall Pub_ExpressMath(char **Express,char * Value, bool Checkeds, int Division = 1)
{
*Express = new char[20];
strcpy(*Express, "tteesstt");
return true;
}


App工程中:
char *p;
Pub_ExpressMath(&p, NULL, NULL);

ShowMessage(p);

delete []p;
lirg8405 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ccrun 的回复:]
一种方法是预定义一个空间足够大的数组作为缓冲。
二是传一个指针进去,在函数内部用new申请一片内存空间,并存放结果数据,调用者负责清场(delete[]);
[/Quote]
这个第二个步骤怎么弄,我在内部申请的结果函数了好像自己清空了
lirg8405 2009-07-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ccrun 的回复:]
一种方法是预定义一个空间足够大的数组作为缓冲。
二是传一个指针进去,在函数内部用new申请一片内存空间,并存放结果数据,调用者负责清场(delete[]);
[/Quote]
这个第二个步骤怎么弄,我在内部申请的结果函数了好像自己清空了
ccrun.com 2009-07-21
  • 打赏
  • 举报
回复
一种方法是预定义一个空间足够大的数组作为缓冲。
二是传一个指针进去,在函数内部用new申请一片内存空间,并存放结果数据,调用者负责清场(delete[]);
lirg8405 2009-07-21
  • 打赏
  • 举报
回复
本来我是想在第一个参数,传计算公式进去后,结果也通过第一个参数返回,但是怎样确保有足够的空间保存返回的值,如我传进去的计算式是1/3,那么返回的值需要的空间肯定大于原来的,怎么办呢?
ccrun.com 2009-07-21
  • 打赏
  • 举报
回复
char *Result = "0.00";
这里的Result最好是定义成足够大的一个字符串数组作缓冲,如:
char Result[256] = "0.00";

13,824

社区成员

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

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