怎样截获调用的DLL中的异常?
我调用一个DLL,DLL执行过程中,报出错误信息。我怎么能截获这些信息,不让其显示出来? 问题点数:100、回复次数:9Top
1 楼zhang1000(多一个零)回复于 2002-10-09 16:13:06 得分 0
调用的相关代码用
try
{
}
catch(...)
{
}
可以截获吗?
如果DLL是你自己写的,最好在DLL中处理,然后返回错误信息.Top
2 楼dingfuhai(loading)回复于 2002-10-09 16:23:06 得分 0
try截获不到,DLL不是我写的,如果是我写的就好办了。劳驾,给小弟想想办法Top
3 楼blh(当你不割肉时,你的损失只是个数字,当你割肉时,你的损失就是你的肉)回复于 2002-10-09 16:30:33 得分 0
??
你怎么知道dll出错了,难道他没显示吗??呵呵Top
4 楼dingfuhai(loading)回复于 2002-10-09 20:29:22 得分 0
这个DLL中有个函数是,得到IC卡扫描器的设备句柄,我没有安装IC卡扫描器所以调用失败。出现一个ERROR MESSAGE对话框,请问我怎么才能屏蔽这个对话框Top
5 楼alphapaopao(炮炮)回复于 2002-10-10 23:21:19 得分 0
一场沿着堆栈传播(stack),所以你只要沿着堆栈的方向,你都可以截获到,
而不用管在哪一个DLL里面Top
6 楼dingfuhai(loading)回复于 2002-10-10 23:55:16 得分 0
alphapaopao:请问具体怎么实现,请细说好吗?Top
7 楼alphapaopao(炮炮)回复于 2002-10-11 00:15:15 得分 0
f()
{
f1();
}
f1()
{
f2();
}
f3()
{
f4();
}
这几个函数可以分别属于不同的DLL, 但是你可以从任何父函数中截获到子函数中的异常Top
8 楼alexxing(赤铸)回复于 2002-10-11 00:54:18 得分 100
我觉得楼上的没有搞明白人家的问题,这里的问题不是 try catch,首先人家不一定使用了 C++ 标准异常机制,可能是自己用 return false 返回异常信息。
因为函数内部先打开了对话框,然后再退出。即使它用 throw Exception 还是用 return false 返回了异常信息,你可以用 try 或者判断返回值知道发生了异常,也无法阻止那个对话框(因为它已经打开了)。唯一的办法好像就是设法拦截对话框调用。
拦截步骤:
1. 设法找出是调用什么API显示的对话框:
1.1. 利用 tdump.exe 或者 implib.exe (这些都是 Borland 的工具,VC 下应该有类似的工具)观察 DLL 的 import 信息,找出可能是对话框显示的函数,例如 MessageDlg, MessageBox,DialogBox,ShowMessage ……
1.2. 运行你的程序,在弹出对话框之前运行 winsight 工具(或者其它监视工具,网上有此类的共享软件,据说功能还不错),观察其 API 调用情况,确定是哪个 API,例如 MessageBox
2. 拦截:用合适的工具(最简单的如 UltraEdit,当然也有专用工具,或者自己编程序)修改 DLL 的 import 入口,把那个 MessageBox 替换成你自己的函数。如果这个 DLL 内部还有其它场合也用到了这个 MessageBox,你就需要判断函数的入口参数,分别处理。否则,最简单的做法就是替换成空函数
可能我的办法太笨了,也许高手还有更简单的办法,呵呵Top
9 楼dingfuhai(loading)回复于 2002-10-12 11:17:37 得分 0
多谢楼上的兄弟。Top




