首页
社区
课程
招聘
[讨论]调试Dll输出函数的问题。
发表于: 2011-1-31 22:59 4892

[讨论]调试Dll输出函数的问题。

2011-1-31 22:59
4892
在VC写的DLL里定义输出函数GLC,调试时有问题

输出函数:
unsigned char licH[16];
extern   "C"   int   __declspec(dllexport) GLC(unsigned long int ID,                                                 int KEY,
                                 unsigned long int   iID,
                                unsigned long int   flags,
                                char *licH)
{
        strcpy(licH,"AABC");
        return 0;
}

调用代码
00403980  push    ebp           //***  压ebp
00403981  mov     ebp, esp
00403983  push    00A1A55C
00403988  mov     eax, dword ptr [ebp+8]
0040398B  push    eax
0040398C  push    887B
00403991  push    009253A0
00403996  push    5E09204F
0040399B  call    <jmp.&Key.GLC>         调用Key.dll的输出函数GLC
004039A0  mov     dword ptr [A1A564], eax
004039A5  cmp     dword ptr [A1A564], 0
004039AC  je      short 004039C0
004039AE  push    0
004039B0  push    0
004039B2  push    00927444
004039B7  call    <jmp.&MFC42.#1200_AfxMessageBox>
004039BC  xor     eax, eax
004039BE  jmp     short 004039C5
004039C0  mov     eax, 1
004039C5  pop     ebp     //***执行这条指令后,ebp=5E09204F,奇怪,不是开头压的ebp
004039C6  retn

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

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 179
活跃值: (26)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
C调用约定的话,要调用者自己平衡堆栈的吧。
调用完函数之后加上一句 esp+14h试试。
2011-1-31 23:39
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
找到这么一段话:
采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。

看来默认是__cdecl方式的,谢谢2楼
2011-2-1 09:46
0
游客
登录 | 注册 方可回帖
返回
//