关于C++Builder写的DLL传char给VB

alpha704 2007-12-19 04:57:02
extern "C" __declspec(dllexport) bool __stdcall TestOut(char * TestValue);
extern "C" __declspec(dllexport) bool __stdcall TestIn(char * TestValue);

bool __stdcall TestOut(char * TestValue)
{
AnsiString x = "FFBBBBBBBBBBBBBBBBBBFEB8";
TestValue = x.c_str();
MessageBox(NULL,TestValue,"DLL Test",MB_OK);
return(true);
}

bool __stdcall TestIn(char * TestValue)
{
MessageBox(NULL,TestValue,"Test",MB_OK);
return(true);
}


VB调用TestIn正常,但调用TestOut失败,显示为空,现象上没有改变TestValue的值,但C++BUilder里MessageBox显示是正确的.不知道为什么.VB用byref传入的参数不能改吗?还是c++builder传参数不能传出来?
...全文
135 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2007-12-20
  • 打赏
  • 举报
回复
首先,对于宿主程序调DLL这样的情况,建议申请由主程序提供,也就是统一由主程序进行申请和释放。

需要的就是对VB的String先申请空间,然后再传到DLL当中并且提供了预分配的内存大小(当然,个人建议是可以由被调用函数返回一个需要的长度,当传入的值不足时,返回一个需要的长度,并且同时可以SetLastError([Need more buffer,有一个相应的系统错误号,具体不记得了,可以查看一下资料,据说注册表操作的时候这个最常用到])。这样子在VB当中先收到一个错误号,然后再按所需大小进行分配空间,再调用一次,而如果足够的话,也可以进行进一步内存缩小,而不至于里面保存有多余的脏数据。
alpha704 2007-12-20
  • 打赏
  • 举报
回复
问题再简化一下,怎样用C++Builder做一个能在参数中返回字符串的DLL,供VB调用?
或有没有什么办法在参数中返回不定长AnsiString或char *的数据给VB?
最主要的就是参数中三个字
alpha704 2007-12-20
  • 打赏
  • 举报
回复
相同,运行VB调用程序马上就出错退出,没有任何显示.
有没有其它办法?
程序是用在一个串口接收函数上的,数据是不确定的大数据,里面用 unsigned char ReceiveData[1024] 但数据不可能只有1024这么点数据,所以用循环接收,每次接收完了之后赋给AnsiString变量,最后用AnsiString 转给char *变量传出,可是在这里用wsprintf还是一样不行,根据我的说明有没有其它办法? char *代替AnsiString在这里可行吗?怎么实现?
kmfangxun 2007-12-19
  • 打赏
  • 举报
回复


AnsiString x = "FFBBBBBBBBBBBBBBBBBBFEB8";

// x为临时变量,函数执行后就不存在了
//所以需要拷贝一份,这样就应该可以了,
wsprintf(TestValue,"%s",x.c_str() );
i_love_pc 2007-12-19
  • 打赏
  • 举报
回复
最好用Char*来代替AnsiString

13,871

社区成员

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

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