Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Esent在Delphi项目中与Windows 8崩溃_Delphi_Windows 8_Esent_Edb - Fatal编程技术网

Esent在Delphi项目中与Windows 8崩溃

Esent在Delphi项目中与Windows 8崩溃,delphi,windows-8,esent,edb,Delphi,Windows 8,Esent,Edb,我已经在我的项目中广泛使用了ESENT,我真的很喜欢它的简单和快速。而且也很稳定 但是我有一个Windows8的大问题!!!无论我如何链接到esent.dll(动态或静态),每当我调用JetSetSystemParameter以外的其他东西时,dll都会崩溃,使我的应用程序崩溃 不幸的是,我仍然无法让它运行。我的代码在Windows 7或更高版本上运行时没有问题。但在Windows 8中,当我尝试创建实例时,esent.dll会崩溃(浮点无效操作) 我尝试了所有可能的通话约定。这绝对不是问题所在

我已经在我的项目中广泛使用了ESENT,我真的很喜欢它的简单和快速。而且也很稳定

但是我有一个Windows8的大问题!!!无论我如何链接到esent.dll(动态或静态),每当我调用JetSetSystemParameter以外的其他东西时,dll都会崩溃,使我的应用程序崩溃

不幸的是,我仍然无法让它运行。我的代码在Windows 7或更高版本上运行时没有问题。但在Windows 8中,当我尝试创建实例时,esent.dll会崩溃(浮点无效操作)

我尝试了所有可能的通话约定。这绝对不是问题所在。我又试了一些,发现了这种奇怪的情况:1。我使用VS 2012创建了一个演示应用程序,JetCreateInstance运行良好。2.Delphi XE3中完全相同的代码将发送esent.dll崩溃。3.我使用VS 2012创建了一个DLL,导出了在上面的演示应用程序中完美工作的方法,认为这是一个Delphi错误。4.然后我将DLL加载到一个demo Delphi项目中(使用6、XE2和XE3进行了尝试)。调用方法和BOOM。同样的碰撞


现在我的假设是微软不允许?!?任何其他开发人员环境都无法正确使用esent.dll这可能吗?

该错误是一个浮点无效操作,使问题听起来好像与浮点控制字有关

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

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

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

Set8087CW($027F);
这将屏蔽所有异常,并将FPU控制字设置为默认Windows设置

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


这是一个使用Delphi提供的库的稍微危险的游戏,因为
Set8087CW
由于使用全局变量
Default8087CW
而不是线程安全的。如果您想了解有关该问题的更多信息,请参阅。

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

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

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

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

Set8087CW($027F);
这将屏蔽所有异常,并将FPU控制字设置为默认Windows设置

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


这是一个使用Delphi提供的库的稍微危险的游戏,因为
Set8087CW
由于使用全局变量
Default8087CW
而不是线程安全的。如果您想了解更多有关该问题的信息,请参阅。

可能是Delphi的FPU设置。你试过改变吗?重复:最好关闭另一个。因为这是一个更好的问题,因为它提供了编程环境和更好的异常诊断。FPU设置做到了这一点。很抱歉微软指责你做了傻事;)可能是Delphi的FPU设置。你试过改变吗?重复:最好关闭另一个。因为这是一个更好的问题,因为它提供了编程环境和更好的异常诊断。FPU设置做到了这一点。很抱歉微软指责你做了傻事;)