调用dll中函数出现:HEAP[HFDC.exe]: Invalid Address specified to RtlValidateHeap( 01040000, 012C12C0 ) 错误提示!

腌鲜鳜鱼 2008-10-27 01:56:27
我的dll中的输出函数是:
char* MD5_Algorithm(CString Soure)
{
unsigned char szObject[16];
char output1[33];
char output[33]={"\0"};
unsigned int iLen = strlen (Soure);
char szSour[33];

for(int i=0;i<iLen;i++)
{
szSour[i]=Soure.GetAt(i);
}
MD5 context;
CMD5 cmd5;
cmd5.MD5Init(&context);
cmd5.MD5Update(&context, (unsigned char*)szSour, iLen);
cmd5.MD5Final(szObject, &context);
for ( i = 0; i < 16; i++)
{
sprintf(&(output1[2*i]),"%02x",(unsigned char)szObject[i]);
}
for(i=0;i<32;i++)
output[i]=output1[i];
return output;
}

然后我在一个基于mfc的对话框程序中调用:
......
static char cTempUserName[33];
MD5_Algorithm(cTempUserName);
......
通过跟踪,我发现exe程序成功调用dll的函数,并且进行了正确的计算,即:
output中的值是我需要的值,但是一过
......
return output 这句

就提示:Invalid Address specified to RtlValidateHeap( 01040000, 012C12C0 )

请问这时怎么回事?在网上找了很多方法都不行!


...全文
441 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
腌鲜鳜鱼 2008-10-27
  • 打赏
  • 举报
回复
问题已经解决了,根据你们的提示,我把输出函数改成:
void MD5_Algorithm(CString* Soure,char* output);
即在exe中生成,这里只是给个指针。
前面出错主要就在于,CString Source,dll将它释放后,exe中得不到这个值,就出错了!
palmax 2008-10-27
  • 打赏
  • 举报
回复
你在调试时的watch窗口里好好看看你用到那些字符数组变量的值 我这里没法帮你调
腌鲜鳜鱼 2008-10-27
  • 打赏
  • 举报
回复
分清了啊,但是改成全局还是有问题!
上面有我修改的代码啊!
palmax 2008-10-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyijc 的回复:]
我在编译dll的时候没有出错。
[/Quote]

无语了。 连编译警告和编译错都分不清
腌鲜鳜鱼 2008-10-27
  • 打赏
  • 举报
回复
你们说的对我有些启发,我现在这样改了下:
static char *output = (char *)malloc(33);

char* MD5_Algorithm(CString Soure)
{
unsigned char szObject[16];
char output1[33];
unsigned int iLen = strlen (Soure);
char szSour[33];
for(int i=0;i<iLen;i++)
{
szSour[i]=Soure.GetAt(i);
}
........
for ( i = 0; i < 16; i++)
{
sprintf(&(output1[2*i]),"%02x",(unsigned char)szObject[i]);
}
for(i=0;i<32;i++)
output[i]=output1[i];
output[32] = '\0';
return output;
}

在dll中跟踪到这里出错:
HeapValidate( _crtheap, 0, pHdr(pUserData) );
这个函数来自于vc里面的dbgheap.c文件。
这个提示是什么原因呢?
shine0415 2008-10-27
  • 打赏
  • 举报
回复
因为你的output是动态库的临时变量,临时变量会在你return output以后把output在栈上的内存空间释放掉.所以当你在外部接受的时候这段内存的值已经不存在了.所以说你指定了无效的地址(Invalid Address specified ).修改的方法有可以向一楼的所说在堆上申请一块内存单元.但是记得在你的调用程序中记得释放哦.

本人认为最好将你的output在调用程序中申请内存然后以作为参数形式传进来,最后在调用程序内释放(这样不容易因为忘了释放而造成内存泄露).
腌鲜鳜鱼 2008-10-27
  • 打赏
  • 举报
回复
我在编译dll的时候没有出错。
palmax 2008-10-27
  • 打赏
  • 举报
回复
你那个是局部变量,你返回局部变量的地址当然是非法的,编译的时候就没有警告吗?
shenyi0106 2008-10-27
  • 打赏
  • 举报
回复
char output[33]==> char * output =(char *)malloc(33);

15,471

社区成员

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

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