(问题在最后)
我对不断更改 FPU 控制字的第三方 COM 组件感到非常头疼。
我的开发环境是Windows和Visual C++ 2008。正常的FPU控制字指定在各种情况下不应该抛出异常。我通过查看 float.h 中的 _CW_DEFAULT 宏以及在启动时查看调试器中的控制字来验证这一点。
每次我调用 COM 对象时,控制字都会在返回时被修改。这很容易防御。我简单地重置了控制字,一切都很好。问题是当 COM 组件开始调用我的事件接收器时。我可以在收到事件调用后立即通过重置控制字来保护我的代码,但是一旦我从事件调用返回,我就无法做任何事情。
我没有这个 COM 组件的源代码,但我正在与作者联系。我从他那里得到的回应是“嗯?”。我不认为他有丝毫线索我在说什么,所以我担心我必须自己做点什么。我相信他的运行时(我认为它是 Delphi 或 Borland C++,因为 DLL 充满了符号名称,全部以大写 T 开头),或者他正在使用的一些其他第三方代码,这导致了问题。我不认为他的代码明确修改了 FPU 控制字。
那么,我能做什么呢?从业务的角度来看,使用这个第三方组件势在必行。从技术角度来看,我可以放弃它,自己实现通信协议(protocol)。然而,这将非常昂贵,因为该协议(protocol)涉及处理信用卡交易。我们不想承担责任。
我迫切需要一个 hack-around,或者一些关于 Borland 产品中 FPU 设置的有用信息,我可以将这些信息传递给组件的作者。
有什么我可以做的吗?我不认为组件作者有能力修复它(从他相当无知的回答来看)。
我一直在考虑安装我自己的异常处理程序,我只是重置了处理程序中的控制字,并告诉 Windows 继续执行。我尝试使用 SetUnhandledExceptionFilter() 安装处理程序,但由于某种原因,未捕获异常。
感谢大家的建议。我已经向作者发送了说明,说明他可以做些什么来让不仅仅是我,还有他的代码的许多其他客户的生活更轻松。我建议他在 DllMain(DLL_PROCESS_ATTACH) 处采样 FPU 控制字,并保存控制字以备后用,这样他就可以在调用我的事件处理程序之前重置 FPU CW,并从我的事件返回电话。
目前,如果有人感兴趣,我有一个 hack-around。变通可能很糟糕,因为我不知道它会对他的 代码做什么。我早些时候收到确认,他没有在他的代码中使用任何 float ,所以这应该是安全的,除非他使用了一些依赖于 FPU 异常的第三方代码。
我对应用所做的两项修改:
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()功能。
但是,由于游戏没有规则,我相信 COM 对象供应商有理由拒绝更改他们的代码并将责任推给您。
如果这不是 100% 的结论性答案,我很抱歉,但我无法将所有这些想法都写进评论中!
关于windows - 第三方代码正在修改 FPU 控制字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933690/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru
我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub