gpt4 book ai didi

c++ - WindowProc 中的异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:37 26 4
gpt4 key购买 nike

是否可以在 WindowProc 回调中捕获错误? try/catch 不起作用。看起来 __try __except 和硬件异常(例如 AV)也不起作用。


更新:

我发现确实可以在 WindowProc 回调中抛出异常,并在 WindowProc 外用 catch block 捕获它。测试并适用于 Windows XP x86。我找到了相关问题 64bit exceptions in WndProc silently fail该问题似乎只存在于 Windows 7 x64 上(并且根据该问题也存在于其他 x64 Windows 版本上)。

所以问题是有没有可能以某种方式在 WindowProc 中抛出异常并在 WindowProc 之外用 catch block 捕获它?我安装了 Microsoft 修补程序,在注册表中将 DisableUserModeCallbackFilter 设置为 1,我得到的最好结果是 FATAL_USER_CALLBACK_EXCEPTION,这不是我的异常(exception)。

最佳答案

MSDN documentation for WindowProc有关于从 WindowProc 抛出/传播的异常的详细信息。似乎异常仅在 32 位版本的 Windows 中传播。

但是,您的原始问题与更新中的问题不同。第一个是关于在 WindowProc 中捕获异常,它总是可以正常工作。第二个是关于从 WindowProc 中抛出异常。

我不确定第二个的用处/必要性。窗口过程通常被调用为:

  1. 在消息循环中调用 DispatchMessage。在这种情况下不需要抛出异常,因为这样做只会导致应用程序退出。如果遇到应导致应用程序退出的错误,只需调用 PostQuitMessage(0)
  2. 调用 SendMessage。在这种情况下,你真的不想抛出异常,因为窗口过程将在 UI 线程中执行,如果调用线程与 UI 线程不同,调用线程无论如何都不会得到异常
  3. 直接调用窗口过程。在这种情况下,异常会正常工作。

关于c++ - WindowProc 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14642722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com