我在 WPF 中使用 C++ 库。它是磁条读取器/写入器的 SDK。当我在 WPF 中调用它的方法之一时,10 秒后我收到 StackOverFlowException。从按钮单击事件调用的方法。
[DllImport("MSR_API.dll")]
static extern bool MSR_InitComm(string portname, UInt32 baud);
此方法连接到磁条读取器设备。首先,我在 Windows 窗体应用程序上测试了此方法,一切都很好。但是当我开始使用这个库编写 WPF 应用程序时,我每次都会收到 StackOverFlowException。这个“特征”的原因可能是什么?
[DllImport] 声明错误是一个常见原因。 CallingConvention 属性非常重要。出错会导致堆栈不平衡,如果您经常调用它,最终会导致 SO。有一个 MDA 可以解决这个问题,请确保您没有关闭 PinvokeStackImbalance。使用 Debug + Windows + Registers 是另一种诊断方法,调用前后 ESP 寄存器值必须相同。
C 或 C++ 代码通常需要 CallingConvention.Cdecl,除非该代码是使用 __stdcall 关键字显式编写的。
好的,Embarcadero 链接提出了例外的另一个原因。 Borland 库传统上启用 FPU 异常。这与 .NET 代码完全不兼容。尤其是 WPF,因为它大量使用双精度来控制控件的大小和位置。 FPU 堆栈溢出有点奇怪,您通常会遇到 NaN 值的问题。
如果您没有该库的源代码,那么您就没有很多有吸引力的选项来解决问题。您可以尝试的一件事是在第一次调用库后抛出并捕获异常。 .NET 异常处理管道会重置 FPU 控制字。像这样:
bool ok = MSR_InitComm("COM1", 9600);
try {
throw new Exception("Fpu reset intended");
}
catch (Exception) {
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)