我正在编写使用第三方SDK(OCX)的应用程序。我在C#中使用SDK,它运行得很好。但是,我可以使用Delphi 2007中SDK的相同对象创建最简单的测试应用程序,它可以编译好,但是当它到达某个点时,它在同一台机器上。我运行了一些其他使用SDK的测试应用程序,它们运行正常,所以我知道SDK安装正常且运行正常。
我使用的其他Delphi项目不使用此特定SDK正常运行。
有关如何尝试解决此问题的任何想法?我是否需要删除我在Delphi中安装的OCX并将其添加回来?你是怎么做到的?
答案 0 :(得分:3)
很不寻常的问题。基于Windows NT的操作系统通常非常擅长包含在用户应用程序内部的Ring 3中发生的故障。有问题的SDK是否通过内核级驱动程序与硬件交互?此外,系统BSOD时屏幕上会显示哪些信息。有时这是问题性质的线索(例如中断处理程序重入问题,硬件故障,中断冲突)。我偶尔会看到Dialogic板的这种问题。问题也可能是与驱动程序无关的内核级错误。
如果没有其他细节,除了推测原因之外,还有很多事情要做。我倾向于认为这不是FPU控制字问题,但我可能是错的。 FPU控制字问题可能导致异常,但异常需要在关键执行上下文中发生,例如驱动程序,它不会被操作系统捕获和处理。
FWIW我看到Delphi JNI库中的FPU控制字问题导致JVM和宿主应用程序崩溃。修复是使用代码显式包装调用来更改和恢复NineBerry建议的控制字。这项工作提供的应用程序不是多线程的。
答案 1 :(得分:2)
事实证明这是由卡巴斯基反病毒引起的。我通过对崩溃转储运行Windbg来跟踪它,它指向kl1.dll。在搜索后,我追踪this article,将其识别为卡巴斯基。我禁用卡巴斯基,BSOD不再发生。
答案 2 :(得分:1)
浮点异常可能会导致问题。大多数运行时环境禁用浮点异常,但使用Delphi时,它们会被启用。
禁用浮点异常,请使用以下代码:
Set8087CW($133f);
请注意,这也会改变您自己代码的行为。如果浮点计算中存在错误,则不会再出现任何异常,而是将结果变量设置为NaN,Inf +或Inf - 。
答案 3 :(得分:0)
仅仅因为您可以从其他应用程序中使用SDK,并不意味着它没有问题。它可能对某些数据项甚至对不应存在的项反应严重 - 假设内存中的内容没有正式包含任何内容。
我确定你遇到了由未初始化的数据项引起的错误,这些数据项只能获得内存中的任何值,这样的事情可能会继续传入相关的数据区。(比方说,填充字节在记录结构中...)