第三方代码正在修改 FPU 控制字

2024-03-09

简介 - 又长又无聊的部分

(问题在最后)

我对不断更改 FPU 控制字的第三方 COM 组件感到非常头疼。

我的开发环境是Windows和Visual C++ 2008。正常的FPU控制字指定在各种情况下不应抛出异常。我已经通过查看验证了这一点_CW_DEFAULT宏发现于float.h,以及在启动时查看调试器中的控制字。

每次我调用 COM 对象时,控制字都会在返回时被修改。这很容易防御。我只是重置了控制字,一切都很好。问题是当 COM 组件开始调用我的事件接收器时。我可以通过在收到事件调用后立即重置控制字来保护我的代码,但从事件调用返回后我无法立即执行任何操作。

我没有这个 COM 组件的源代码,但我正在与作者联系。我从他那里得到的回应是“嗯?”。我认为他对我在说什么一无所知,所以我担心我必须自己做点什么。我相信他的运行时(我认为是 Delphi 或 Borland C++,因为 DLL 充满了符号名称,全部以大写 T 开头),或者他正在使用的其他第三方代码,导致了问题。我不认为他的代码显式修改了 FPU 控制字。

那么,我能做什么呢?从商业角度来看,使用这个第三方组件势在必行。从技术角度来看,我可以放弃它,自己实现通信协议。然而,这将非常昂贵,因为该协议涉及处理信用卡交易。我们不想承担责任。

我迫切需要一种破解方法,或者一些有关 Borland 产品中 FPU 设置的有用信息,我可以将这些信息传递给组件的作者。

问题

有没有什么I可以做?我认为组件作者没有能力修复它(从他相当无能的回答来看)。

我一直在考虑安装自己的异常处理程序,其中我只是重置处理程序中的控制字,并告诉 Windows 继续执行。我尝试安装处理程序SetUnhandledExceptionFilter(),但由于某种原因,异常没有被捕获。

  1. 为什么我没有捕获异常?
  2. 如果我成功捕获 FPU 异常,重置 FPU 控制字,然后让执行继续,就像什么都没有发生一样 - 那么所有的赌注都结束了吗?

Update

我要感谢大家的建议。我已向作者发送了说明,说明他可以采取哪些措施来让我以及他的代码的许多其他客户的生活变得更轻松。我建议他应该对 FPU 控制字进行采样DllMain(DLL_PROCESS_ATTACH),并保存控制字供以后使用,以便他可以在调用我的事件处理程序并从我的调用返回之前重置 FPU CW。

现在,如果有人感兴趣的话,我有一个解决方案。这种黑客攻击可能是一件坏事,因为我不知道它会做什么his代码。我之前已经收到确认,他在代码中没有使用任何浮点数,所以这应该是安全的,除非他使用一些依赖于 FPU 异常的第三方代码。

我对我的应用程序进行的两项修改:

  1. 包裹我的消息泵
  2. 安装窗户挂钩(WH_CALLWNDPROC)捕获绕过消息泵的极端情况

在这两种情况下,我都会检查 FPU CW 是否已更改。如果有,我将其重置为_CW_DEFAULT.


我认为您关于该组件是在 Embarcadero 产品中编写的诊断很可能是正确的。 Delphi 的运行时库确实启用了浮点异常,C++ Builder 也是如此。

Embarcaderos 工具的优点之一是浮点错误可以转换为语言异常,这使得数字编码变得更加容易。这对你来说不会有什么安慰!

整个区域是一个巨大的 PITA。对于 FP 控制字没有任何规则。这是一场完全免费的比赛。

我不认为捕获未处理的异常不会完成工作,因为 MS C++ 运行时可能已经捕获了这些异常,但我不是该领域的专家,我可能是错的。

我相信,唯一现实的解决方案是,每当执行到达代码时,将 FPU 设置为您想要的值,并在执行离开代码时恢复它。我对 COM 事件接收器了解不够,无法理解为什么它们会阻碍执行此操作。

我的产品包含一个用 Delphi 实现的 DLL,但我却遇到了相反的问题。大多数调用的客户端都有一个禁用异常的 FPU 控制字。我们采取的策略是在入口处记住8087CW,在执行代码之前将其设置为标准的Delphi CW,然后在出口处恢复它。我们也通过在进行回调之前恢复调用者的 8087CW 来小心处理回调。这是一个普通的 DLL 而不是 COM 对象,因此它可能更简单一些。

如果您决定尝试让 COM 供应商修改他们的代码,那么他们需要调用Set8087CW() http://docwiki.embarcadero.com/VCL/en/System.Set8087CW功能。

然而,由于游戏没有规则,我相信 COM 对象供应商拒绝更改其代码并将责任归还给您是合理的。

抱歉,如果这不是 100% 结论性的答案,但我无法将所有这些想法纳入评论!

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

第三方代码正在修改 FPU 控制字 的相关文章

  • 如何将枚举类型放入字符串列表中?

    这行代码 ShowMessage GetEnumName TypeInfo TAlign 1 返回 alTop 当我想使用字符串变量 TAlign 而不是TAlign时 如何将枚举类型的所有值放入字符串列表中 就像是 ShowMessage
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • MSI 安装程序,64 位操作系统,写入 \windows\system32\inetsrv 文件夹

    在 Windows Server 2008 64 位上 我需要一个 msi 安装程序文件来将一些文件写入 windows system32 inetsrv 文件夹 这些文件是一些 XML 架构验证文件 C XmlReaderSettings
  • 有用的 Delphi 代码模板

    我用 Delphi 编程已经两年多了 我大概只有 5 个自定义模板 我觉得我应该有更多 如果有人有任何特别有用的东西 那么在 stackoverflow 上有一个很好的存储库就太好了 我不在乎您使用的是 Delphi 2009 语法还是 D
  • 在 Python 中静默打印 PDF

    我正在尝试使用 Python 打印 PDF 而不打开 PDF 查看器应用程序 Adobe Foxit 等 我还需要知道打印何时完成 以删除文件 Here http permalink gmane org gmane comp python
  • Delphi XE4 中是否可以更改应用程序短标题而不使其与项目 dpr 名称相同?

    我正在编写我的第一个由 delphi 驱动的 iPhone 应用程序 我已经创建了它 但我希望将其命名为 dpr 文件名称以外的名称 因为 dpr 文件不能包含空格 例如 EXE 名称并不总是与人们可能分配给应用程序的人类可读名称相同 而在
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 使用 TArray 而不是 Array of T 的原因是什么?

    我正在将遗留的 Delphi 应用程序迁移到 Delphi XE2 我想知道是否有充分的理由替换定义为的数组Array of MyType to TArray
  • CakePHP PaginationRecallComponent,严格 (2048):PaginationRecallComponent::initialize() 声明

    我尝试插入分页调用组件 http bakery cakephp org articles Zaphod 2012 03 27 paginationrecall for cakephp 2 x http bakery cakephp org
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 将键码转换为相关的显示字符

    在 C Windows Forms 项目中 我有一个不提供 KeyPressed 事件的控件 它是一个 COM 控件 ESRI 映射 它仅提供 KeyUp 和 KeyDown 事件 包含关键事件参数 http msdn microsoft
  • 无法在 Windows 10 上运行 Python 3.7“权限被拒绝”

    当尝试使用 Git Bash 在 Windows 10 上运行 Python 3 7 时 出现以下错误 python version bash c Users Name AppData Local Microsoft WindowsApps
  • 如何在 Windows 上应用差异补丁?

    有很多程序可以创建差异补丁 但我在尝试应用一个程序时遇到了很大的困难 我正在尝试分发补丁 但用户向我询问了如何应用该补丁 于是我尝试自己弄清楚 结果发现我毫无头绪 而且我能找到的大多数工具都是命令行的 我可以处理命令行 但是如果没有一个漂亮
  • msvcrt.getch() 每次都会检测到空格

    我正在编写一个简单的Python代码 它应该检测我的击键 但由于某种原因 在每次击键后检测空格 代码 import msvcrt print press escape to quit text while 1 char msvcrt get
  • C# 中的 Unix 套接字

    我正在尝试使用 Mono 的 UnixEndPoint 但在使用它之前就失败了 我在 64 位 Windows 7 系统上运行 Xamarind net 4 5 下面是一些代码 证明单一组合不起作用 foreach SocketType s
  • 为进程设置环境变量

    环境变量的概念是什么 在 C 程序中 我需要调用可执行文件 该可执行文件将调用驻留在同一文件夹中的一些其他可执行文件 可执行文件依赖于两个环境变量 PATH 和 RAYPATH 的正确设置 我尝试了以下两件事 我创建了一个进程并在 Star
  • QWinTaskbarProgress 不会显示

    我使用的是windows7和Qt5 3 0 我在 MainWindow 的构造函数中添加了以下内容 但任务栏上没有显示任何内容 我错过了什么 QWinTaskbarProgress pTaskbarProgress new QWinTask
  • forrt1:严重(170):程序异常 - 堆栈溢出

    并提前感谢您的帮助 我已经编译了一个程序 不是我编写的 它在 Mac 上运行得很好 但是当我尝试在 Windows 上执行该程序时 在程序开始执行后不久 我收到以下错误消息 forrt1 严重 170 程序异常 堆栈溢出 我不是 ifort
  • 如何在Windows命令行中执行for循环?

    我想知道这是否可能 我不熟悉使用 Windows 命令行 但我必须将它用于我正在处理的项目 我有许多文件 我需要为每个文件执行一个功能 我习惯使用 python 但显然这有点不同 所以我希望得到一些帮助 基本上 我需要 for 循环来迭代文
  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques

随机推荐

  • 如何在本机反应中使用 MapLibre GL Js

    我正在寻找一种在我的反应本机应用程序中使用 OpenStreetMap 数据的方法 在我最近的研究中 我发现MapLibre https maplibre org 这是基于MapBox GL旧版本的免费选项 我面临的问题是 除了 react
  • 在线生成 JHipster 应用程序提供空白页面

    当我从本地安装的 JHipster 4 7 生成应用程序时 我可以通过运行 mvnw 在 localhost 8080 上启动它 没有任何问题 但是当我在线生成项目时https start jhipster tech https start
  • 如何用动画取消隐藏视图

    假设我在 iOS 版 Xcode 中有一个隐藏视图 现在 当我将视图设置为不隐藏 view hidden NO 时 如何使其现在显示 但带有动画 你可能想要的不是设置view hidden 但要设置view alpha to 0 对应于hi
  • sqlalchemy 连接到服务器,不指定数据库

    是否可以连接到MSSQL服务器 using sqlalchemy然后创建数据库 我使用以下内容 sqlalchemy create engine mssql pyodbc sa pwd localhost 但我收到一个错误 Detail D
  • XML:尾随部分不允许有内容

    我收到这些错误 Multiple annotations found at this line error Error parsing XML not well formed invalid token Content is not all
  • GraphQL:你能改变查询的结果吗?

    书面这个问题 https stackoverflow com questions 52318135 defining mutations in graphql via fields is this bad practice 52322818
  • .net 中的 Ftp 文件监视程序(如 SystemFileWatcher)?

    在我的项目中 我需要连续观看多个 FTP 文件夹 如果有任何新文件出现 我需要选择文件名并执行一些处理 如果那是正常的 Windows 本地文件系统文件夹 我可以通过使用来实现系统文件观察器 net 的 有没有类似的东西系统文件观察器观看
  • 在 C++/CLI 中使用 .NET (3.5) 任务并行库

    好吧 我下载了 Reactive Extensions for NET 3 5 以便在 Visual Studio 2008 中通过 c cli 使用它 但所有任务并行库示例都是用 C 编写的 我什至无法弄清楚将简单的 C 语句转换为 C
  • Xamarin.iOS 上的本地化

    我正在尝试解决 Xamarin iOS 上的本地化问题 总的来说 我对本地化很陌生 但我们想要做的第一种语言是冰岛语 如果你查看 iOS 设备本身的设置 冰岛语不是一个选项 所以这是一个由两部分组成的问题 如何在我的应用程序中设置本地化 我
  • WPF/C#:如何在 TabControl 中引用 TabItem?

    我确信我错过了一些简单的东西 但我必须承认 在这一点上我不知所措 我以编程方式将 TabItems 添加到我的主 TabControl 一个对应于用户选择打开的每个帐户 在创建和添加新的 TabItem 之前 我想检查用户是否已在另一个选项
  • 在 Gradle 和 IntelliJ 2016.3.5 中使用断点调试 JVM 应用程序(Java 或 Scala)

    我有一个 JVM 应用程序 需要在 IntelliJ 2016 3 5 中使用断点和 Gradle 任务 作为依赖项运行和测试 进行调试 关于如何使用 Gradle 和 IntelliJ 完成调试有多种来源 使用 IntelliJ 调试 G
  • Redis 作为消息代理

    Question 我想以发布 订阅的方式在应用程序之间传递数据 数据产生的速度可能比消耗的速度高得多 并且消息会丢失 这不是问题 想象一下一个快速传感器和一个慢速传感器数据处理器 为此 我使用 redis pub sub 并编写了一个充当订
  • 更改 KeyPress 上 JTextField 的大小

    当用户在文本字段中输入文本时 我必须扩展 KeyPressed 事件上 JTextField 的大小 请告诉我如何实现此目的 提前致谢 好的 跳起来 我们假设问题是 如何调整 JTextField 的宽度以始终适合其内容宽度 平时的合作者
  • p:commandButton 立即 = true

    当我声明时会采取什么行动immediate true 在命令按钮中 文档说 布尔值 确定操作事件的phaseId 当在 应用请求值 阶段处理 true 操作时 当在 调用应用程序 阶段处理 false 时 但是 我不明白 有人可以解释一下吗
  • 如何防止滚动条与内容重叠?

    我有一个预格式化代码块 它水平溢出 因此有一个水平滚动条允许用户查看内容 overflow auto 然而 在 IE7 也许其他 IE 版本 中 滚动条与我的内容的最后一行重叠 当只有一行内容时 这尤其令人恼火 我已经尝试过列出的解决方案h
  • 沿路径长度线性填充 SVG 动画

    我有一个 SVG 文件 它代表薄形 我想制作一个动画 以便整个形状似乎正在被拉出来 我所说的三星 Galaxy S 品牌的 S 标志示例 https codepen io anon pen MGawzy https codepen io a
  • 命名空间“System.Web”中不存在类型或命名空间名称“Optimization”

    我正在部署一个新网站作为我的主网 站 它运行得很好 我的根 url 下的所有应用程序都可以正常工作 除了一个 它是一个被大量使用的遗留系统 c net 不幸的是 我无法访问源代码 当我运行旧应用程序时www mysite com crm h
  • 现在的 Unix 时间戳输出为 1970 [重复]

    这个问题在这里已经有答案了 我想在将来生成一些 unix 时间戳 因此我使用像这样的生成器unixtimestamp com http www unixtimestamp com 但是 当我在 chrome 或 Firefox 的 cons
  • Xlwings 从定义的名称中获取值

    我有一个具有定义名称的 Excel 单元格 A1 已指定名称 myName xlwings 有没有办法从其名称而不是其坐标中获取其内容 它应该是相同的 title coord next wb defined names myName des
  • 第三方代码正在修改 FPU 控制字

    简介 又长又无聊的部分 问题在最后 我对不断更改 FPU 控制字的第三方 COM 组件感到非常头疼 我的开发环境是Windows和Visual C 2008 正常的FPU控制字指定在各种情况下不应抛出异常 我已经通过查看验证了这一点 CW