如题,SetUnhandledExceptionFilter为什么在VS2008无效?
同样的代码在VC7下好好的,完全可以使用。
为什么会这样?
同样的代码在VC7下好好的,完全可以使用。
为什么会这样?
解决方案 »
- 如何实现CScrollView滚动条的换肤功能???
- CMFCPropertyGridCtrl 首列最小问题
- 我是菜鸟,求指教。谢谢大侠们了。
- 如何使单文档菜单栏中的“编辑”中的所有菜单项变成可用状态?
- 问个技术发展方向的问题
- 如何使调用了MATLAB函数的VC程序在未装MATLAB的平台上运行
- 想提高水平的进来啦!!!
- 求救:在软件中嵌入光盘刻录的功能该如何下手?
- 怎么做一个包括对话框的DLL?请说详细一些,300分。
- 怎样将字符转换成字符串?
- VC中导入到RC中的BMP文件,怎么用cvLoadImageM来获取?
- 测试别人用vs2005生成的Dll库,在别人的电脑上能用,在我的电脑上就提示程序初始化失败(0xc0150002)的一个错误,搞了好久没搞定,请大侠们多多指点
void CUnhandledExceptionCapture::Disable_SetUnhandledExceptionFilter()
{
void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter");
if ( addr != NULL )
{
unsigned char code[16];
int size = 0;
code[size++] = 0x33;
code[size++] = 0xC0;
code[size++] = 0xC2;
code[size++] = 0x04;
code[size++] = 0x00; DWORD dwOldFlag, dwTempFlag;
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
}
}
DWORD dwOldFlag, dwTempFlag;
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
我检测了返回值,都返回成功啊。
SetUnhandledExceptionFilter我写在InitInstance里面的。另外debug和Release对于这个处理也不一样。Release能处理的了,debug会被自带的调试机制抢占吊。
我是放在全局变量的构造函数里面的
还加了#pragma init_seg(compiler)这个。
dbghelp.lib都加了对吧?
// 我在崩溃发生前取出the top-level exception handler,发现为 NULL,
// 那说明我设置的自定义异常处理函数被清掉了,SetUnhandledExceptionFilter(NULL);LPTOP_LEVEL_EXCEPTION_FILTER pp = SetUnhandledExceptionFilter(NULL);// pp == NULL // 发现 pp 为 NULL// 这是我的测试语句
TCHAR* p = NULL;
*p = 0;这应该说明下面这个函数
// 使 SetUnhandledExceptionFilter API 失效
void CUnhandledExceptionCapture::Disable_SetUnhandledExceptionFilter()
{
void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter");
if ( addr != NULL )
{
unsigned char code[16];
int size = 0;
code[size++] = 0x33;
code[size++] = 0xC0;
code[size++] = 0xC2;
code[size++] = 0x04;
code[size++] = 0x00;
DWORD dwOldFlag, dwTempFlag;
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
}
}
失败了,可以我检查返回值都赶回 TRUE 啊,不懂了
研究了几天,终于有个了解了,虽然结果不是我想要的。
我是在AutoCAD 2011 下用SetUnhandledExceptionFilter,今天发现在我用之前,
AutoCAD 2011 已经将 SetUnhandledExceptionFilter hook 了,先我一步了,
再等我使用 SetUnhandledExceptionFilter 的时候,被 AutoCAD 2011 直接"patching a return instruction into the asm" 了。我操……白忙活了几天!