vc调用bcb窗体的奇怪问题,请问该如何解决?
一个奇怪的问题,调用后堆栈对不齐,老是说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则中常,
请问各位达人该如何处理这种情况?总不能每次调用都手动修改吧?