bcb 如何在DLL中捕捉系统级异常
http://topic.csdn.net/t/20031023/09/2385627.html
--------------------------------------------------
我创建了一个动态库,库中实现了对Socket(TCP、UDP)的封装,其中使用了BCB的TClientSocket,当使用该ClientSocket去连接一个并不存在的服务器时必然导致会ESocketError异常。
问题:我该如何捕捉到该异常?
如下代码明显不行,请哪位高手帮帮忙!!!!!!!!!!!!!
try
{
ConnectServer();
}
catch(...)
{
NULL;
}
回复于:2003-11-12 10:23:27
现将自己在这方面的一点简单的见解说出来,希望能给有需要的朋友一点提示。
1、在VCL中ESocketError异常未定义在EXCEPTION_EXECUTE_HANDLER框架中,所以try...catch(...)将不能对其捕捉。
2、但...TClientSocket的OnError事件对其异常进行了捕捉,所以可以通过处理OnError事件来处理该异常,并设置ErrorCode = 0,来返回异常标识EXCEPTION_EXECUTE_HANDLER,并完成处理
3、但...如果该TClientSocket类被动态创建并被封装与线程之中并制成动态库,重载OnError无效,无法捕捉异常(尚不明白为什么会这样...如果对动态库运作有认识的朋友不妨一起讨论讨论)。
4、不过,我们还是可以在线程起始或异常发生处使用结构性异常来定义捕捉该异常,如:
__try {...} __except(EXCEPTION_EXECUTE_HANDLER) {...}
5、其实上述的所有皆是对指定点进行异常捕捉,但是当异常通过了所有的捕捉(EXCEPTION_CONTINUE_SEARCH)时,将最终被定位在系 统未定义异常处理程序中(UnhandledExceptionFilter),即显示异常对话框,这是我们的用户所不愿看到的,你可使用 SetUnhandledExceptionFilter来定义自已未处理异常处理函数。这时所有的异常都在你的掌握之中了。
6、这里还有一种我们不推荐的做法,就是使用Win32提供的SetErrorModel函数并向它传递SEM_NOGPFAULTERRORBOX标识,此标识告诉进程遇到未处理异常时不再询问直接中断返回。
7、同样的还有更改注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\AEDEBUG中的Debugger中的数据等.
以上为未处理异常的一个大概的重点内容,有机会我将贴出我查阅的各部分关于异常的文章,希望起抛砖引玉之功效。以上皆是新手个人见解,如有不当还望高手指正。
http://www.cnblogs.com/-clq/archive/2012/01/09/2316799.html
bcb 如何在DLL中捕捉系统级异常的更多相关文章
- BCB怎么调用DLL中的函数
推荐你看<BCB编写DLL终极手册>这篇文章如下片段:二. 静态调用 DLL使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中将该文件拷贝到当前目 ...
- 如何在TFS中恢复系统默认查询”已指派给我”的设置(TFS 2013)
故事是这样开始的,一天开发人员求助说,在浏览器中修改了系统默认的工作项查询"已指派给我"的后,发现这个查询每次都提示超时,并且没有办法恢复到初始的设置状态,因为出现超时提示以后,查 ...
- 如何在C#中自定义自己的异常
在C#中所有的异常类型都继承自System.Exception,也就是说,System.Exception是所有异常类的基类. 总起来说,其派生类分为两种:1. SystemException类: 所 ...
- Win32 DLL和MFC DLL 中封装对话框
现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题.这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题. ...
- WPF界面开发技巧大放送!DevExpress WPF在TreeListView中扩展N级
DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...
- [转]如何在Java中调用DLL方法
转载地址:http://developer.51cto.com/art/200906/129773.htm Java语言本身具有跨平台性,如果通过Java调用DLL的技术方便易用,使用Java开发前台 ...
- 解决 “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏;使用“rename”限定符 类型库符号与系统符号冲突问题
今天在VS工程当中引入一个组件,编译的时候出现警告, “MoveFile”: 类型库“XXX.dll”中的标识符已经是宏:使用“rename”限定符.虽然只是一个警告,但看着实在不爽,更重要的是,警告 ...
- 如何在VMware中安装Linux系统
这篇文章主要讲述如何在VMware12中安装RHEL6.9Linux操作系统 步骤一: 打开VMware软件,在主页中点击创建新的虚拟机或者点击左上角文件,在列表中点击新建虚拟机,如图: 步骤二: 点 ...
- 如何在C#中引入CPLEX的dll(CPLEX系列-教程一)
以前写在CSDN上的文章.转到博客园之后,打算把这个教程移过来,顺便完善后面的教程.主要是在Asp.Net+EF6里面使用cplex,完成一个最优生产计划的决策.当时在查找如何在C#中引用cplex时 ...
随机推荐
- 我的第一个C语言程序 (A+B Problem)(cheney-yang)
第一个接触的C语言程序,是一个简单的A+B问题! 题目出处:http://acm.nyist.net/JudgeOnline/problem.php?pid=1 题目描述: 计算a+b的值 输入: ...
- json-lib-2.4-jdk15.jar maven
最近自己将一个web项目装换到使用mevan自动管理. 遇到了一个json包导入的问题.最终解决如下: <!-- https://mvnrepository.com/artifact/net.s ...
- windows 环境下mysql 如何修改root密码
windows 环境下mysql 如何修改root密码 以windows为例: 无法开启服务,将mysql更目录下的data文件夹清空,然后调用 mysqld --initialize 开启mysql ...
- Linux下长时间ping网络加时间戳并记录到文本(转)
[root@test ~]# ping 192.168.2.1 -c 10 PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.64 bytes f ...
- codevs 2822爱在心中
不想吐槽题目.... /* K bulabula 算法(好像用哪个T bulabula更简单 然而我并不会 - -) 丑陋的处理cnt: Printf时 cnt中 ans[i][0]==1 的删掉 然 ...
- U3D 实现子弹发射效果
首先,这里子弹要模拟的相似的话,用2D刚体比较好,会有重力,自由落体运动. using UnityEngine; using System.Collections; public class gun ...
- Hibernate 的HQL语句,初级
这里讲解简单的HQL语句,因为很多比较复杂的外查询,用一般的查询很难完成 所以这里需要使用HQL @Test public void selquery(){ System.out.printf(&qu ...
- 浅淡Webservice、WSDL三种服务访问的方式(附案例)
Webservice Webservice是使应用程序以与平台和编程语言无关的方式进行相互通信技术. eg:站点提供访问的数据接口:新浪微博.淘宝. 官方解释:它是一种构建应用程序的普遍模型,可以在任 ...
- 关于get和set访问器以及属性和字段变量的区别问题
属性是对一个或者多个字段的封装. 类里面为什么要用一个共有的属性来封装其中的字段,也可以这样说用共有属性来封装私有变量,其中的好处应该大家都说的出来,就是为了实现数据的封装和保证了数据的安全 ...
- Xcode的控制台调试命令
XCode4.0以后,编译器换成了LLVM 编译器 2.0 与以前相比,更加强大:1.LLVM 编译器是下一带开源的编译技术.完全支持C, Objective-C, 和 C++.2.LLVM 速度比 ...