Windows 为什么AddVectoredExceptionHandler会使我的DLL崩溃?

Windows 为什么AddVectoredExceptionHandler会使我的DLL崩溃?,windows,visual-c++,dll,exception-handling,Windows,Visual C++,Dll,Exception Handling,我尝试将向量异常处理添加到Win32 DLL,但对AddVectoredExceptionHandler的调用从未返回。我刚刚得到一个无用的.exe已停止工作对话框。但是,如果我用Visual C++调试器调试DLL,那么它就可以工作了,并且在适当的时候调用处理函数,一切都很好。 显式地说,我在初始化DLL时添加处理程序,如下所示 OutputDebugString("before adding\n"); AddVectoredExceptionHandler( 1, VectoredExcep

我尝试将向量异常处理添加到Win32 DLL,但对
AddVectoredExceptionHandler
的调用从未返回。我刚刚得到一个无用的
.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
之前检查这些异常代码,一切都很好。

outputdugstring
每当调用它时都会引发异常。因此,异常处理程序通过调用它导致无限递归,这会导致堆栈溢出。有关更多详细信息,请参阅

在内部,调试字符串作为异常处理。OutputDebugString使用DBG_PRINTEXCEPTION_C(定义为0x40010006)和字符串地址和大小作为异常参数调用RaiseException


当发生异常时,是否有可能您的dll实际上已被卸载?请注意,DebugView不是100%可靠的-OutputDebugString调用可能会丢失。@500 InternalServerError:The.exe从未尝试卸载.dll,即使没有异常,
AddVectoreDeceptionHandler
也会出现问题。我知道它在Vista x64上工作正常,我已经使用过它。至少给我们看一个调用堆栈。使用工具附加调试器+附加到进程。假设存在环境问题。@HansPassant,如果您的意思是在“停止工作”对话框出现后附加到进程,则调用堆栈窗口中不会出现任何内容。如果我单击对话框中的调试按钮,它提供的唯一调试器是Visual Studio 2010,我没有该调试器的许可证,而不是我使用的Visual Studio 2010 Express。但我会编辑问题以显示我发现的更多信息。