求助..C++编写dll的非常简单问题,会者不难.

aaronhocn 2010-01-13 12:24:27
最近在修改一个C++的Dll代码,开发环境为VS2005 .
增加一个功能,其实说通俗一点.就是根据传入的一个列表,以";"分隔的,然后根据拆分出来字符,查找对应的值,再返回

以";"组合的值.因本人对C++不熟悉.特求朋友帮忙.我写的代码如下:

dll代码如下:



全局字符变量
//namesstring存放的格式为"name1;name2;name3;name4";是从外部程序调用Setname设定,字符的长度不限
char * namesstring;

//valuesstring,字符的长度不限,根据namesstring值,获取的数据,并与其一一对应,
//其内容格式为"value1;value2;value3;value4"
//name1的值为value1,name2的值为value2,name3的值为value3.......
//该内容给提供给外程序调用Getvalue方法输出
char * valuesstring;



//根据name内容.返回其对应的value值
char getinfo(char * name)
{
//这里省略一些业务代码,根据name而查找相关内容,并返回name对应的value值
//如果没查到,则返回""
return "";
}


//以下函数为主函数,在Dll中的线程中执行.
void doit()
{
char *delims = ";";
char *Ret;
valuesstring="";
char cTemp[1024];

memset(cTemp, 0, 1024);
Ret = strtok(namesstring,delims);
while( Ret != NULL )
{
sprintf(cTemp, "%s;%s", cTemp, getinfo(Ret));
Ret = strtok( NULL, delims );
}
valuesstring=new char[1024];
strcpy_s(valuesstring, 1024, cTemp);
}


//该方法供给外部程序设置namesstring值
bool setname(char * name,int nMaxCount)
{
strcpy_s(namesstring, nMaxCount, name);
return true;
}


//该方法只供给外部程序获取与namesstring值一一对应的valuesstring值
bool getvalue( char * values,int nMaxCount)
{
strcpy_s(values, nMaxCount, valuesstring);
return true;
}



编译之后没有问题,Dll给Delphi7的Exe程序中静太调用 delphi7中的程序中对应namesstring,和valuesstring
定义为string.而且Delphi7中调用 setname的方法为
exe代码如下:


var
sStr:string;
begin
sStr := 'a;b;c;d';
setname(pchar(sStr),length(sStr));
end;


调用 getvalue方法为


var
ARet:pchar;
sRet:string;
begin
GetMem(ARet, 1024);
getvalue(ARet,1024);
sRet := ARet;
FreeMem(ARet);
lable1.caption := sRet; //lable1的为标签控件,显示返回的内容
end;



现有问题如下:
1.程序调用中.有时exe程序中setname调用后,exe程序自动退出,该步有可能是dll中内存有问题致使.
2.程序退出,是指exe程序关闭的时候,报错.报错如下:

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: ...
File: dbgheap.c
Line: 1252

Expression: _CrtIsValidHeapPointer(pUserData)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
终止(A) 重试(R) 忽略(I)
---------------------------


我在网上查了下.有网友说是某些中间状态数组访问异常造成.但dll当中只有cTemp这个数组起中间状态.我也不知道
该如何改进,或改良.我判断Exe程序没有问题,因为这种调用方法是我之前做过很多项目都是这样调用的.因为我不熟悉
C++,我觉是应该是Dll中问题.特发此贴.求广大C++朋友帮我看看.能否帮我改良这个Dll的代码,或者纠正我的错误之处

.非常感谢!!!





...全文
269 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttzyanswer 2010-02-25
  • 打赏
  • 举报
回复
引用 6 楼 aaronhocn 的回复:
to nifh80s:

setname完整代码是这样:我之前发贴太急了.没补完全..

C/C++ codeif (!namesstring)
{
namesstring=newchar(nMaxCount);
}
strcpy_s(namesstring, nMaxCount, name);returntrue;


if (!namesstring)
namesstring 你是全局的..这就是问题!
你想想调用两次 setname 情形...
不明白?
第一次 namesstring为空.DLL 分配内存.
第二次 发现namesstring不为空.直接用了原先的内存区.假如这个时候 nMaxCount 这个参数过大... 那么就overflow了!
xiaoji 2010-01-14
  • 打赏
  • 举报
回复
如果只是调用setname而不是调用doit出问题的话,那可能是unicode和ascii的问题,你C++的dll里面是用ascii,如果delphi里面用的是unicode就会出问题,c++的unicode版本的字符串操作函数一般以wcs开头的,例如wcscpy_s,但是建议用TCHAR类型的函数,例如 lstrcpy,_tccpy_s等,然后在编译选项中设置语言类型
jxydhzw 2010-01-13
  • 打赏
  • 举报
回复
namesstring = new char[nMaxCount];

aaronhocn 2010-01-13
  • 打赏
  • 举报
回复
to xiaoji9981:

你说的很对.但我的确是这么严格执行的.Dll当中的变量我在Exe当中是不会去释放
Exe当中的变量 .Dll当中也不会去释放..

我把exe当中FreeMem(ARet);去掉之后.问题依然存在...
xiaoji 2010-01-13
  • 打赏
  • 举报
回复
FreeMem(ARet);
问题就出在这一句,应该在dll中添加一个方法,专门用来释放内存
xiaoji 2010-01-13
  • 打赏
  • 举报
回复
这是一个常识性问题,dll里面分配的内存,只能在本dll中释放,exe里面分配的内存也只能在本exe中释放,否则是会出问题滴
maoloverme1 2010-01-13
  • 打赏
  • 举报
回复
这种问题多半是内存操作非法造成的,设个断点调试一下一般就能找到问题
aaronhocn 2010-01-13
  • 打赏
  • 举报
回复
to nifh80s:

setname完整代码是这样:我之前发贴太急了.没补完全..

if (!namesstring)
{
namesstring = new char(nMaxCount);
}
strcpy_s(namesstring, nMaxCount, name);
return true;
西贝山人 2010-01-13
  • 打赏
  • 举报
回复
setname函数里namesstring没有开辟空间导致错误的吧。
aaronhocn 2010-01-13
  • 打赏
  • 举报
回复
to oyljerry:
要不请你帮忙给写个C++代码.就实现我那种功能.现在我郁闷的很.找不着错误的地方!!
aaronhocn 2010-01-13
  • 打赏
  • 举报
回复
是标准的..
oyljerry 2010-01-13
  • 打赏
  • 举报
回复
DLL是否为标准Window DLL格式,需要__stdcall 调用
aaronhocn 2010-01-13
  • 打赏
  • 举报
回复
咋没人回啊..是太难了吗?晕...

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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