当从c++库调用方法时,WPF中的StackOverFlowException

本文关键字:WPF 中的 StackOverFlowException 方法 c++ 调用 当从 | 更新日期: 2023-09-27 18:16:33

我在WPF中使用c++库。它是磁条阅读器/写入器的SDK。当我在WPF中调用它的一个方法时,我在10秒后收到StackOverFlowException。从按钮单击事件调用的方法。

[DllImport("MSR_API.dll")]
static extern bool MSR_InitComm(string portname, UInt32 baud);

此方法连接磁条读取器设备。首先,我在Windows窗体应用程序上测试了这种方法,一切都很好。但是当我开始用这个库编写WPF应用程序时,我每次都会收到StackOverFlowException。这个"功能"的原因是什么?

当从c++库调用方法时,WPF中的StackOverFlowException

获得错误的[DllImport]声明是一个标准原因。CallingConvention属性非常重要。如果调用错误,会导致堆栈不平衡,如果调用次数足够频繁,最终会导致SO。这里有一个MDA,确保你没有关闭pinvokestack失衡。使用Debug + Windows +寄存器是另一种诊断方法,ESP寄存器的值在调用前后必须相同。

CallingConvention。C或c++代码通常需要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) {
}