vc调用bcb窗体的奇怪问题,请问该如何解决?

xabcxyz 2005-03-20 12:28:40
一个奇怪的问题,调用后堆栈对不齐,老是说ESP故障。

VC6原码如下:
switch(message){
case WM_COMMAND:
wmId = LOWORD(wParam);
switch (wmId) {
case IDM_TESTFORM:
ShowWnd(NULL); // 该函数是动态加载自BCB生成的dll,作用是弹出一个VCL窗体
break;
反汇编如下:
004014B0 |> \8BF4 MOV ESI,ESP
004014B2 |. 6A 00 PUSH 0
004014B4 |. FF15 C4354200 CALL NEAR DWORD PTR DS:[ShowWnd]
004014BA |. 83C4 04 ADD ESP,4
004014BD |. 3BF4 CMP ESI,ESP
004014BF |. E8 7C020000 CALL vct._chkesp
004014C4 |. EB 3C JMP SHORT vct.00401502

现象:执行CALL NEAR DWORD PTR DS:[ShowWnd]时,ShowWnd函数内部在函数退出时已经自动使
用ret 4把堆栈中的参数,ShowWnd(NULL);的NULL弹出了,可是,VC6又执行了ADD ESP,4
结果:CALL vct._chkesp时出现了致命故障

如果:手动将ADD ESP,4的83C4 04 改为909090的nop nop nop则中常,
请问各位达人该如何处理这种情况?总不能每次调用都手动修改吧?
...全文
56 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
吹泡泡的小猫 2005-03-20
  • 打赏
  • 举报
回复
这是函数调用约定不同造成的,VC默认的调用约定是__cdecl,首先在bcb的dll中将导出函数设置为__stdcall类型,然后在VC调用代码部分也使用__stdcall声明函数指针

15,472

社区成员

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

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