如何保证清理代码在 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、错误分配和关闭窗口) 的相关文章

  • C++ 最大非负整数

    以下内容是否会在所有平台 int 大小等上按预期工作 或者有更容易接受的方法吗 我做了以下的事情 define MAX NON NEGATIVE INT int unsigned int 1 2 我不会通过解释它在做什么来侮辱你的智商 编辑
  • 我可以在 WinRT / Windows 8 Store 应用程序中绑定 DynamicObject

    我有以下代码 public class MyClass DynamicObject INotifyPropertyChanged Dictionary
  • 仅使用 1 行 C++ 初始化 2d 向量

    我需要能够初始化一个 2D 向量 int同一条线我在其中创建它 更具体地说 我必须创建一个3x2大小 2D 向量并将其所有值设置为 0 仅使用1行代码 有没有一种方法可以在不使用 for 循环和几行代码的情况下完成此操作 尝试这个 std
  • 这个洗牌算法有什么问题吗?

    我一直在做一些休闲假期计算 我的迷你项目是模拟意大利游戏 tomboli 一个关键的组成部分是对以下过程的模拟 游戏由一名男子控制 他拿着一袋 90 个弹珠 编号为 1 到 90 他从袋中随机取出一颗弹珠 每次向玩家喊出弹珠编号 经过一番思
  • 从 proc/pid/cmdline 解析命令行参数

    我正在尝试解析命令行参数另一个程序 这是一个模拟器 在我的程序中使用system 命令和模拟器的pid 不幸的是同时使用文件读取和cat 输出格式不正确 所以我无法真正获取数据 cat在命令行上显示删除了空格的文件内容 整个字符串粘在一起
  • float.Parse 不再在 Unity 中工作 (C#)

    我有一个包含以下代码行的工作项目 public InputField mass float val float Parse mass text 非常简单 用户输入一定量的质量 然后将其从文本解析为浮动 几天前这工作得很好 我什至能够多次导出
  • 如何找到 QDockWidget 标题栏的高度?

    我正在尝试找到 a 的高度QDockWidget标题栏 以便对自定义布局进行一些智能调整大小 但标题栏不是单独的小部件 它内置于停靠小部件的私有布局中 并且没有成员可以访问它 还有其他方法可以找到它的高度吗 是的 您可以使用以下命令找到标题
  • 从网站保存嵌入的 pdf

    我正在编写一个小型 C 应用程序来管理供应商提供的 化学品 安全数据表 目前 我手动搜索该化学品并保存 pdf 并在我的程序中添加指向 pdf 的链接 问题是我还有很多化学品需要处理 所以最好将过程自动化 例如 化学品的部件号如下 2710
  • 在 QtCreator 中查看数组内容

    调试时是否可以在 Qt Creator 中查看数组的内容 似乎检测到我的数组是一个数组而不是一个指针 此外 我可以点击一个箭头 就像展开一样 但之后什么也没有显示 当我试穿的时候std vector Qt Creator 设法按预期显示内容
  • gcc总是做这种优化吗? (公共子表达式消除)

    作为示例 假设表达式sys gt pot atoms item gt P kind mass在循环内求值 循环只改变item 因此表达式可以简化为atoms item gt P kind mass通过将变量定义为atoms sys gt p
  • 在 C、C++ 中实现腐蚀、膨胀

    我对二值图像的膨胀是如何完成的有理论上的了解 AFAIK 如果我的 SE 结构元素 是这样的 0 1 1 1 在哪里 代表中心 我的图像 二进制是这样的 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
  • invoke_result获取模板成员函数的返回类型

    如何获取模板成员函数的结果类型 下面的最小示例说明了该问题 include
  • 列表框显示类名称而不是值

    我正在开发一个项目 其中用户应该向动物输入值 名称 年龄 性别等 并且用户输入的值应该显示在列表框中 这些类相互继承 以下是继承的工作原理 Animalclass 是所有类的父类 Mammal类继承自Animal class Dog类继承自
  • 创建 .ICS 文件,添加到 Outlook

    我正在创建一个简单的应用程序 允许用户下载 ICS 文件 并将其导入到他们选择的日历应用程序 站点中 我对创建过程感到满意 但对在 Outlook 中打开它们有疑问 将使用C ASP NET进行开发 当我打开一个日历时 它会添加一个新日历
  • 接口作为类型约束和接口作为参数之间的区别?

    如果我想创建一个采用实例的方法IList作为参数 或任何其他接口 但让我们使用IList作为一个例子 我可以创建一个带有类型约束的通用方法 例如 public static void Foo1
  • SoapHttpClientProtocol:以流而不是字符串的形式获取响应?

    我正在使用一种网络服务 它可以一次性输出大量数据 响应字符串可能约为 8MB 虽然在台式电脑上这不是问题 但嵌入式设备在处理 8MB 字符串对象时会发疯 我想知道是否有办法以流的形式获取响应 目前我正在使用如下方法 我尝试使用 POST 请
  • 如何检查多个变量是否等于同一值?

    如何比较多个项目 例如 我希望检查所有变量 A B 和 C 是否都等于字符 X 或所有三个变量都等于 O 如果其中 2 个为 X 1 个为 O 则应返回 false I tried if A B C X A B C O Do whateve
  • 如果 foreach 是一个结构数组,它会复制每个元素吗?

    我有一个结构数组 做foreach运算符在迭代数组时复制每个元素 据我所理解foreach只是底层的语法糖转换为for 所以看来答案是否定的 但我很想得到一些确认 PS 看来应该有人已经问过了 但我无法轻易找到任何东西 因此 请以提供的参考
  • C/C++ 中的最小二乘回归

    如何在 C C 中实现因子分析的最小二乘回归 the黄金标准是LAPACK http www netlib org lapack lug node27 html 你特别想要xGELS
  • C# 泛型中的通配符等效项

    假设我有一个通用类 如下所示 public class GeneralPropertyMap

随机推荐

  • 自然排序 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