2012-05-29 64 views
0

我正在使用C#中的.NET 3.5应用程序,它定期调用一些传统的C++代码。我注意到,当将鼠标悬停在具有下拉列表的Infragistics UltraGrid上时,调用C++有时会导致“溢出或下溢算术操作”。我发现,在C++代码执行以下操作时,这只是发生:在C++中重置8087CW导致.NET应用程序出现异常

Word SavedWord = Default8087CW; 
Set8087CW(0x133f); // Disable all fpu exceptions 

... 

Set8087CW(SavedWord); 

如果我注释掉最后一行,我不再是我的.NET应用程序出现错误。我没有注意到其他应用程序中的其他副作用。作为一个快速解决方案,我想将此行注释掉。禁用FPU异常并且不重置控制字的后果是什么?

+0

Default8087CW的值是否为进入C++函数时的实际值?还是C++ RTL认为是默认值?这两者可能有所不同。 –

+0

@ 500-InternalServerError,我将如何检查?我所能确认的是,退出C++代码后的Default8087CW的值与输入时相同。 – Everett

+0

我不熟悉如何在C++中执行此操作。没有相应的Get8087CW()函数吗? –

回答

0

在其他机器上测试之后,似乎注释掉Set8087CW(SavedWord);行只能解决我的机器上的问题。在我的Infragistics版本中似乎存在一个错误(8.2.2008.2204)。回滚到8.2.20082.1000确定了问题。

+1

嗯,可疑。有很多代码与Borland运行时对FPU控制字的更改不兼容。 *任何* .NET代码都会受到攻击。考虑到你已经在你的程序中找到了这个片段,你必须已经遇到过这样的代码。这是另一个例子:http://stackoverflow.com/a/8357646/17034 –

+0

这是一个非常有趣的帖子,@HansPassant。我已经切换回Infragistics的新版本,并实施了这里提到的解决方案。似乎工作。你想添加一个答案与该职位的参考? – Everett

相关问题