我尝试在我的Win32 DLL中添加向量异常处理,但调用
具体来说,我是在我的DLL初始化时添加处理程序,如下所示:
AddVectoredExceptionHandler
从未返回。我只得到无用的<app name>.exe已停止工作
对话框。然而,如果我使用Visual C++调试器调试dll,则它可以正常工作,并且处理程序函数会在适当的时间调用,一切都很好。具体来说,我是在我的DLL初始化时添加处理程序,如下所示:
OutputDebugString("before adding\n");
AddVectoredExceptionHandler( 1, VectoredExcepHandler );
OutputDebugString("after adding\n");
当未经过调试器运行时,DebugView 显示的是 "添加前" 而不是 "添加后"。
这个处理程序看起来像下面这样:
static LONG CALLBACK VectoredExcepHandler( PEXCEPTION_POINTERS exInfo )
{
OutputDebugString("reached handler\n");
return EXCEPTION_CONTINUE_SEARCH;
}
噢,如果有关系的话,我正在运行Vista Home 64。
事件查看器显示错误是kernel32.dll中的访问冲突。
进一步的发现几乎解决了问题:我发现,如果我在句柄中注释掉OutputDebugString
调用,则错误会消失。所以我猜测有一些异常与OutputDebugString
不兼容。显然它不是一些常见的异常代码,比如访问冲突和非法指令,因为如果我在调用OutputDebugString
之前检查这些异常代码,一切都很好。
AddVectoredExceptionHandler
仍会出现问题。 - JWWalker