如何保证清理代码在 Windows C++ 中运行(SIGINT、错误分配和关闭窗口)

2024-04-26

我有一个 Windows C++ 控制台程序,如果我不调用ReleaseDriver()在我的程序结束时,某些硬件会进入错误状态,并且在不重新启动的情况下无法再次使用。 我想确定一下ReleaseDriver()即使程序异常退出,例如如果我点击Ctrl+C或关闭控制台窗口。

我可以用signal()创建一个信号处理程序SIGINT。这工作正常,尽管当程序结束时它会弹出一个恼人的错误“发生未处理的 Win32 异常...”。

我不知道如何处理控制台窗口被关闭的情况,并且(更重要的是)我不知道如何处理由错误的内存访问等引起的异常。

谢谢你的帮助!


在Windows下,您可以通过调用创建未处理的异常过滤器设置未处理异常过滤器() http://msdn.microsoft.com/en-us/library/ms680634(VS.85).aspx。完成后,只要在应用程序中某处生成未处理的异常,就会调用您的处理程序。

您的处理程序可用于释放资源、生成转储文件(请参阅小型转储写转储 http://msdn.microsoft.com/en-us/library/ms680360(VS.85).aspx),或任何您需要确保完成的事情。

请注意,围绕如何编写异常处理函数存在许多“陷阱”。尤其:

  1. 您不能调用任何 CRT 函数,例如new
  2. 您无法执行任何基于堆栈的分配
  3. 如果您在处理程序中执行任何导致异常的操作,Windows 将立即终止您的应用程序,并从其背部撕下骨头。您不再有机会优雅地关闭。

您可以调用许多 Windows API 函数。但你不能sprintf, new, delete... 简而言之,如果它不是 WINAPI 函数,它可能不安全。

由于上述所有原因,建议将所有变量都放在处理函数中static变量。您将无法使用 sprintf,因此您必须在初始化期间提前格式化字符串。请记住,当调用处理程序时,机器处于非常不稳定的状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何保证清理代码在 Windows C++ 中运行(SIGINT、错误分配和关闭窗口) 的相关文章

随机推荐

  • 自然排序 WordPress 帖子标题(按字母顺序和数字)?

    有没有可能的方法按标题对新的 WordPress 帖子查询进行排序 但按数字而不是按字母顺序排序 我有一些标题有很多按字母顺序相同的名称 然后有一个数字 所以当然 例如 WordPress 正在放置title12在之前title1 args
  • 使用 Orchard HQL API 将非 ContentPart 表连接到 ContentPart 表

    我正在尝试使用 Orchard HQL API 在两个不同的表之间执行简单的联接 问题是其中一个表不是 ContentPartTable 这可能吗 这是常规 SQL 中的样子 Select From ItemPartRecord Join
  • 如何使自定义 django 迁移可逆?

    我最初的问题是 给定一个包含 60M 行的数据库表 我需要将字段类型从布尔字段转换为整数字段 我想为此创建一个自定义的 django 迁移 如果您有比这更好的方法 请告诉我 如下所示 def make changes apps schema
  • HTML 页面中的目录选择器

    如何在 html 页面中创建目录选择器 如果我使用输入文件元素 我只能选择文件 但我需要选择目录 我需要这样做 因为用户应该在他的计算机内选择正确的路径 有什么解决办法吗 试试这个 我想它会对你有用
  • 有没有C语言的跨平台GUI库? [复制]

    这个问题在这里已经有答案了 可能的重复 GUI 应用程序的跨平台 C 库 https stackoverflow com questions 2018850 cross platform c library for gui apps 有没有
  • XMPP会议室邀请函

    在我的聊天应用程序中 我想实现群聊功能 同样 我想创建房间并向我的朋友发送加入房间的邀请 这是我加入并邀请朋友进入房间的代码 创建房间 Create Room btn CreateRoom Button findViewById R id
  • LLDB 给出局部变量的“使用未声明的标识符”错误

    在以下函数中 我无法在 LLDB 中看到 recordMap for 循环打印键 recordType 设置正确 但 p recordMap 给出错误 使用未声明的标识符 我可以在 LLDB 中很好地看到变量 recordType 所以我处
  • python 和 pandas - 如何使用 iterrows 访问列

    wowee 如何将 iterrows 与 python 和 pandas 一起使用 如果我进行行迭代 我是否应该无法使用 row COL NAME 访问 col 以下是列名称 print df Int64Index 152 entries
  • .net 中什么是类型安全?

    什么是类型安全 它是什么意思以及为什么它很重要 如果你问 类型安全 的概念是什么general意味着 它是代码的特征 允许开发人员确定某个值或对象将表现出某些属性 即属于某种类型 以便他 她可以以特定方式使用它 而不必担心意外或未定义的情况
  • 多个 Facebook 评论实例

    每当用户使用 JQuery 执行特定操作时 我都需要在页面上加载多个 Facebook 评论框 http developers facebook com docs reference plugins comments 如果我要一次加载所有评
  • 在 MediaElement.js 中的视频末尾停止而不是倒带

    我想知道如何在视频结束时停止 MediaElement js 播放器 我想知道如何在视频结束时停止 mediaelement js 播放器 我希望保留最后一帧 而不是像现在一样倒带显示第一帧 是否可以改变这种行为 我为这个问题编写了一个修复
  • 如何在制表符中显示选择编辑器文本而不是值

    As the 编辑器选择 http tabulator info docs 4 1 edit edit values steve Steve Boberson bob Bob Jimmerson jim Jim Stevenson 我可以发
  • 覆盖 gem 的 lib 文件夹中的私有方法

    spree auth devise gem 中有一个私有方法 该方法位于控制器 UserSessionsController 内部https github com spree spree auth devise blob master li
  • Node 和 NPM 运行脚本和 Ctrl-C 触发 SIGINT 两次

    我在运行的一个 Nodejs 应用程序上遇到了问题npm start 这只是node app js 我的应用程序包含一个 sigint 处理程序 如下所示 process on SIGINT gt db disconnect then pr
  • 在Python中对字典键进行排序[重复]

    这个问题在这里已经有答案了 我有一个字典 其中每个键引用一个 int 值 根据值将键排序到列表中的最佳方法是什么 我喜欢这一个 sorted d key d get
  • 如何以编程方式将 ContextMenu 添加到系统托盘图标?

    我想以编程方式向托盘图标添加上下文菜单 这样当我右键单击托盘图标时 它应该显示菜单 我应该如何为托盘图标编写右键单击事件处理程序 我已经尝试过以下方法 private void Icon MouseRightClick object sen
  • Business Catalyst:检查我们是否位于 Liquid 的根 URL 上

    我想使用 Liquid 标记来测试正在查看的页面是否是主页 但特别是网站的根 URL 例如www mysite com 我尝试使用 globals get 因为根据BC 文档 http docs businesscatalyst com r
  • mongodb Nodejs Each 与 toArray

    我快速浏览了一下 没有找到任何令我满意的答案 但基本上我已经开始使用带有express和mongodb的node js来创建webapi 而不是通常的 Net MVC Web API路线 但我注意到的一件事是 为了返回结果集合 我正在以相当
  • 在 Django 中,当登录 URL 以 ?next=/accounts/logout/ 结尾时,停止重定向回注销

    在我的模板中 我目前正在使用next参数将用户重定向回登录页面之前的页面 a href Log in a The firstof标签确保万一request path无效 那么它将重定向回根 URL 这在除注销页面之外的每个页面上都适用 如果
  • 如何保证清理代码在 Windows C++ 中运行(SIGINT、错误分配和关闭窗口)

    我有一个 Windows C 控制台程序 如果我不调用ReleaseDriver 在我的程序结束时 某些硬件会进入错误状态 并且在不重新启动的情况下无法再次使用 我想确定一下ReleaseDriver 即使程序异常退出 例如如果我点击Ctr