使用veh 给MessageBox设置异常 并接管的例子
时间: 2024-04-09 22:28:07 浏览: 121
Go语言MessageBox用法实例
以下是一个使用VEH机制来拦截并接管MessageBox函数的异常的示例代码:
```c++
#include <Windows.h>
// Vectored Exception Handler函数
LONG WINAPI VehHandler(PEXCEPTION_POINTERS pExceptionInfo)
{
// 判断异常类型为访问冲突异常
if (pExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
{
// 恢复异常现场,使程序继续执行
pExceptionInfo->ContextRecord->Eip += 2; // 跳过引发异常的指令,使其继续执行
// 弹出自定义的消息框
MessageBox(NULL, "Exception occurred!", "Custom Exception", MB_OK | MB_ICONERROR);
// 返回处理结果,终止异常处理链
return EXCEPTION_EXECUTE_HANDLER;
}
// 返回继续搜索异常处理链
return EXCEPTION_CONTINUE_SEARCH;
}
int main()
{
// 注册Vectored Exception Handler
PVOID pHandler = AddVectoredExceptionHandler(1, VehHandler);
if (pHandler == NULL)
{
// 处理注册失败情况
// ...
return 1;
}
// 触发访问冲突异常
int* p = nullptr;
*p = 42;
// 移除Vectored Exception Handler
RemoveVectoredExceptionHandler(pHandler);
return 0;
}
```
在上述代码中,我们定义了一个VEH处理函数`VehHandler`,它会在异常发生时被调用。在`VehHandler`中,我们首先判断异常类型是否为访问冲突异常(EXCEPTION_ACCESS_VIOLATION),如果是,则进行自定义的异常处理逻辑。在本例中,我们跳过引发异常的指令(使程序继续执行),然后弹出一个自定义的消息框来通知异常发生。最后,我们返回`EXCEPTION_EXECUTE_HANDLER`来终止异常处理链。
在`main`函数中,我们首先注册VEH处理函数,然后触发一个访问冲突异常(通过对空指针进行解引用)。当异常发生时,VEH处理函数将被调用,执行我们定义的异常处理逻辑。最后,我们移除VEH处理函数并结束程序。
请注意,上述代码只是一个简单示例,实际使用VEH机制需要根据具体需求进行详细的异常处理和错误处理。
阅读全文