还是老问题:怎么捕获程序中所有的异常?

zhouzhipen 2009-12-25 04:39:12
在下面的代码中,调用DLL中的函数,在函数体执行中的异常可以捕获,但如果DLL的InitializeModule函数不按__stdcall申明
在函数返回时会产生异常而且无法捕获,然后程序就会中止了.
这个DLL只是一个插件,总不能因为一个插件异常而影响整个应用程序吧!
请问有没有办法捕获到这个异常,或者有其它的方法可以解决这个问题?



func()
{
typedef int (WINAPI *DLL_INTETFACE)(int);
HMODULE hModule=LoadLibrary(_T("t.DLL"));
if(hModule==NULL)
return FALSE;
DLL_INTETFACE InitializeModule=(DLL_INTETFACE)GetProcAddress(hModule,_T("InitializeModule"));
if(InitializeModule==NULL)
return FALSE;
__try
{
InitializeModule(0);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
AfxMessageBox(_T("错误!"),MB_OK|MB_ICONSTOP);
}
}
...全文
274 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
danxuezx 2009-12-26
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cnzdgs 的回复:]
引用 13 楼 danxuezx 的回复:
引用 8 楼 cnzdgs 的回复:
栈错误引起的异常很多时候是无法捕获的。
你目前的问题可以通过自己维护栈平衡来解决。
C/C++ code__try
{
    mov eax, InitializeModule
    push ebp
    mov ebp, esp
    push0
    call eax
    mov esp, ebp
    pop ebp
}

期待牛人给解释一下……

是用一段汇编代码,在调用函数前将栈指针保存到ebp寄存器里面,函数返回后再从ebp中取出栈指针,从而确保函数调用前后栈指针不变。

刚发现,前面回复时忘了把__try改成__asm。
[/Quote]
谢谢您
cnzdgs 2009-12-26
  • 打赏
  • 举报
回复
我是说我前面回复应该是__asm{汇编代码},结果写成了__try{汇编代码},这个__try是从上面复制过来的,忘了改。
zhouzhipen 2009-12-25
  • 打赏
  • 举报
回复
不能把__try改成__asm,只能加上,函数执行过程中也有可能会出错!
cnzdgs 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 danxuezx 的回复:]
引用 8 楼 cnzdgs 的回复:
栈错误引起的异常很多时候是无法捕获的。
你目前的问题可以通过自己维护栈平衡来解决。
C/C++ code__try
{
    mov eax, InitializeModule
    push ebp
    mov ebp, esp
    push0
    call eax
    mov esp, ebp
    pop ebp
}

期待牛人给解释一下……
[/Quote]
是用一段汇编代码,在调用函数前将栈指针保存到ebp寄存器里面,函数返回后再从ebp中取出栈指针,从而确保函数调用前后栈指针不变。

刚发现,前面回复时忘了把__try改成__asm。
cnzdgs 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhouzhipen 的回复:]
但是还是想知道原因,为什么"栈错误引起的异常很多时候是无法捕获"?
[/Quote]
因为函数调用的返回地址及寄存器的值都在栈里面,异常捕获机制也要用栈来储存数据。如果感兴趣可以搜索一下异常捕获的原理。

[Quote=引用 15 楼 zhouzhipen 的回复:]
本来是想把200分全给你,但是你的都有这么多的星了,分数对你来说没有什么用了,我还是分点给其它人!
[/Quote]
呵呵,我在VC版的星早就都不见了。参与讨论问题的人是都应该有点分的(乱讲的除外)。
bragi523 2009-12-25
  • 打赏
  • 举报
回复
学习
zhouzhipen 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
栈错误引起的异常很多时候是无法捕获的。
你目前的问题可以通过自己维护栈平衡来解决。
C/C++ code__try
{
mov eax, InitializeModule
push ebp
mov ebp, esp
push0
call eax
mov esp, ebp
pop ebp
}
[/Quote]

自己维护栈这个办法确实解决了不少问题.多谢了,等下结帖!
本来是想把200分全给你,但是你的都有这么多的星了,分数对你来说没有什么用了,我还是分点给其它人!
wangk 2009-12-25
  • 打赏
  • 举报
回复
可以用反汇编引擎搜索该插件导出的函数返回指令,并根据返回后的堆栈是否平衡进行判断。

网上有开源的反汇编引擎。
danxuezx 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
栈错误引起的异常很多时候是无法捕获的。
你目前的问题可以通过自己维护栈平衡来解决。
C/C++ code__try
{
mov eax, InitializeModule
push ebp
mov ebp, esp
push0
call eax
mov esp, ebp
pop ebp
}
[/Quote]
期待牛人给解释一下……
我是苦力 2009-12-25
  • 打赏
  • 举报
回复
感觉这种问题需要设计解决,而不是迁就别人的Code
该怎么样就怎么样,不然程序就不叫程序了,按规则才能有得搞。
dfpgb 2009-12-25
  • 打赏
  • 举报
回复
可以让InitializeModule捕获吗,然后InitializeModule返回值
哈利路亚1874 2009-12-25
  • 打赏
  • 举报
回复
安装自己的异常处理函数,不知道可以捕获不?
期待……
zhouzhipen 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cnzdgs 的回复:]
栈错误引起的异常很多时候是无法捕获的。
你目前的问题可以通过自己维护栈平衡来解决。
C/C++ code__try
{
mov eax, InitializeModule
push ebp
mov ebp, esp
push0
call eax
mov esp, ebp
pop ebp
}
[/Quote]

如果没有更好的办法只有这样了!

但是还是想知道原因,为什么"栈错误引起的异常很多时候是无法捕获"?
cnzdgs 2009-12-25
  • 打赏
  • 举报
回复
栈错误引起的异常很多时候是无法捕获的。
你目前的问题可以通过自己维护栈平衡来解决。
__try
{
mov eax, InitializeModule
push ebp
mov ebp, esp
push 0
call eax
mov esp, ebp
pop ebp
}
chenyu2202863 2009-12-25
  • 打赏
  • 举报
回复
SEH是可以的~

还有,你可以用用C++的try、catch,通过设置_set_se_translate就可以捕获WIndows异常
zhouzhipen 2009-12-25
  • 打赏
  • 举报
回复
难道就没有人有办法么?还是大侠们不愿分享?
zhouzhipen 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]
__stdcall调用不一致,用release版试试,记得Release版本会忽略
[/Quote]

release版更严重:
oyljerry 2009-12-25
  • 打赏
  • 举报
回复
__stdcall调用不一致,用release版试试,记得Release版本会忽略
zhouzhipen 2009-12-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sandyandy 的回复:]
用c++异常
try
{
}
catch(...)
{
}
[/Quote]
用c++异常还是没法解决!


期待有神人出现........
rzsheng 2009-12-25
  • 打赏
  • 举报
回复
正在研究dll,来学习一下
加载更多回复(1)

15,471

社区成员

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

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