首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Esent与Windows 8在Delphi项目上崩溃

Esent与Windows 8在Delphi项目上崩溃
EN

Stack Overflow用户
提问于 2013-03-26 12:37:19
回答 1查看 956关注 0票数 0

我在我的项目中广泛使用了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。这有可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-26 12:42:25

此错误是浮点无效操作,使问题听起来似乎与浮点控制字有关。

默认情况下,Delphi取消浮点异常的掩码。因此,当代码要求浮点单元执行导致错误的操作时,FPU信号将被转换为异常。

但是大多数其他Windows开发环境在FPU上掩盖了这些异常。这样的代码是在假设执行环境有FPU异常的情况下编写的。但是,如果您从Delphi调用DLL,那么执行环境将有未屏蔽的FPU异常,从而打破了这一假设。我怀疑如果你掩盖FPU异常,那么你的问题就会消失。

要测试这是否是问题所在,只需将其添加到代码中,并在其生命早期执行:

代码语言:javascript
复制
Set8087CW($027F);

这将掩盖所有异常,并将FPU控制字设置为默认Windows设置。

从长远来看,您可能希望在每次调用DLL之前掩盖异常,然后在对DLL的调用返回时恢复FPU控制字。

这是一个稍微危险的游戏,使用随Delphi提供的库,因为Set8087CW不是线程安全,因为它使用全局变量Default8087CW。如果你想读更多关于这个问题的文章,我建议你去看QC#107411

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15637269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档