本来昨天搞定了异常处理之后决定狂喜一天,谁知道今天用release编译了一下之后竟然挂了!资料找了半天发现是Windows XP之后提供的一项保护SAFESEH搞的鬼。于是需要将自己的异常处理函数添加进PE头的SAFESEH列表中。方法如下:
    添加一个asm文件,写如下内容:
1 .386
2 .model  flat
3 
4 VL_JIT_X86_EXCEPTION_HANDLER proto
5 .safeseh VL_JIT_X86_EXCEPTION_HANDLER
6 
7 end
    然后在这个文件的属性里面添加命令行/safeseh,并将函数在代码中做成extern "C"就可以了:
 1 /*******************************************************************************
 2 Vczh Library++ 2.0
 3 JIT::X86汇编异常处理器
 4 开发者:陈梓瀚
 5 
 6 接口:
 7 类:
 8 函数:
 9 *******************************************************************************/
10 
11 #ifndef VL_JIT_x86EXCEPTIONHANDLER
12 
13 #include <windows.h>
14 
15 extern "C"
16 {
17     EXCEPTION_DISPOSITION __cdecl VL_JIT_X86_EXCEPTION_HANDLER
18     (
19         struct _EXCEPTION_RECORD *ExceptionRecord,
20         void * EstablisherFrame,
21         struct _CONTEXT *ContextRecord,
22         void * DispatcherContext
23         );
24 }
25 
26 #define VL_JIT_x86EXCEPTIONHANDLER
27 #endif
    这两部合起来就成功将自己的异常处理函数标记成安全的了。
    继续狂喜。 
	
posted on 2009-03-04 08:40 
陈梓瀚(vczh) 阅读(1913) 
评论(2)  编辑 收藏 引用  所属分类: 
JIT