首页
社区
课程
招聘
[求助]如何实现用VC++6写的DLL返回指令为retn 4
发表于: 2017-11-28 09:27 3513

[求助]如何实现用VC++6写的DLL返回指令为retn 4

2017-11-28 09:27
3513
本人小白,打算用VC++6.0写了一个DLL来替换原程序中的DLL,现一切都正常,唯一就是用OD跟踪发现,调用本人编写的DLL中的函数后,返回指令为RETN,导致堆栈不平衡,程序出错。跟踪原DLL发现其返回指令为retn 4。现求助各位大神,如何在vc++中使返回指令为retn 4。谢谢!!!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 244
活跃值: (454)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
给函数加个参数不就好了?
2017-11-28 09:31
0
雪    币: 223
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
加了,不起作用。本来就有1个参数,又加一个还是没效果。
2017-11-28 09:33
0
雪    币: 223
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
extern  "C"  _declspec(dllexport)char  *  dll5(char  *  id,char  *  temp) 

2017-11-28 09:36
0
雪    币: 223
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
哪位大神给个返回指令为RETN  4的DLL的例程,我自己研究一下,谢谢!
2017-11-28 09:41
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
__declspec(naked) void Test()
{
	__asm retn 4;
}

int main(int argc, _TCHAR* argv[])
{
	Test();
	__asm  sub esp, 4

	MessageBoxA(0, 0, 0, 0);

	return 0;
}
这种?
2017-11-28 10:12
0
雪    币: 751
活跃值: (3400)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
7
void  _stdcall  test(int  n)
2017-11-28 10:20
0
雪    币: 1036
活跃值: (1311)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
8
一看你就是用的易语言,易语言调用C方式的DLL就会导致堆栈不平衡,因为易语言默认只有__stdcall
解决办法  :    BOOL  __stdcall  TestFunc(  char*  param)  //    函数定义这样写,一个参数就是  retn  4,  两个参数就是  retn  8。
2017-11-28 10:26
0
雪    币: 2058
活跃值: (1636)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
yeyeshun void _stdcall test(int n)
+1
2017-11-28 10:27
0
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
10
_stdcall,并且你的函数有一个4字节参数时:
例如
int  __stdcall  AddFunc(int  a)
{
    return  a  +  10;
}
2017-11-28 17:35
0
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
基础知识,调用的约定方式
2017-12-13 02:51
0
雪    币: 129
活跃值: (407)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
你可以了解一下调用约定,  C调用约定:__cdecl,  标准调用约定:  __stdcall,  快速调用约定:__fastcall
三种调用约定都有其特性.看雪上有很多文章供你参考.
在这里, 你可以使用 __stdcall
2017-12-13 09:09
0
游客
登录 | 注册 方可回帖
返回
//