我在我的项目中广泛使用了ESENT,我真的很喜欢它的工作速度和速度。也很稳定!!
但是我对Windows 8有一个很大的问题!无论我如何链接到esent.dll (动态的还是静态的),每当我调用JetSetSystemParameter以外的东西时,dll都会崩溃,把我的应用程序推上悬崖。
不幸的是我还是没能让它运转起来。运行Windows 7或更高版本时,我的代码没有问题。但是在Windows8中,当我尝试创建一个实例(浮点无效操作)时,esent.dll会崩溃。
我试过所有可能的电话会议。这绝对不是问题所在。我尝试了更多,发现了这种奇怪的情况: 1.我使用VS 2012创建了一个演示应用程序,JetCreateInstance运行得很好。2.德尔菲XE3中相同的代码会导致esent.dll崩溃。3.我使用VS 2012创建了一个DLL,导出了在上面的演示应用程序中工作得很好的方法,认为这是一个Delphi错误。4.然后在Delphi演示项目中加载了DLL (用6、XE2和XE3进行了尝试)。所谓的方法和繁荣。同样的撞击。
现在我的假设是微软不会允许?!?任何其他开发人员环境都要正确地使用esent.dll。这有可能吗?
发布于 2013-03-26 12:42:25
此错误是浮点无效操作,使问题听起来似乎与浮点控制字有关。
默认情况下,Delphi取消浮点异常的掩码。因此,当代码要求浮点单元执行导致错误的操作时,FPU信号将被转换为异常。
但是大多数其他Windows开发环境在FPU上掩盖了这些异常。这样的代码是在假设执行环境有FPU异常的情况下编写的。但是,如果您从Delphi调用DLL,那么执行环境将有未屏蔽的FPU异常,从而打破了这一假设。我怀疑如果你掩盖FPU异常,那么你的问题就会消失。
要测试这是否是问题所在,只需将其添加到代码中,并在其生命早期执行:
Set8087CW($027F);这将掩盖所有异常,并将FPU控制字设置为默认Windows设置。
从长远来看,您可能希望在每次调用DLL之前掩盖异常,然后在对DLL的调用返回时恢复FPU控制字。
这是一个稍微危险的游戏,使用随Delphi提供的库,因为Set8087CW不是线程安全,因为它使用全局变量Default8087CW。如果你想读更多关于这个问题的文章,我建议你去看QC#107411。
https://stackoverflow.com/questions/15637269
复制相似问题