4

当我调用本机 DLL 时,我的应用程序出现了臭名昭著的0xC00000FD(堆栈溢出)异常。这是通过 Windows CE 5(SH4 处理器)上的托管 C# 应用程序完成的。使用相同的托管应用程序为 Windows XP 编译相同的 DLL,一切正常(没有溢出)。DLL 中的例程正在执行一些非常复杂的递归,这最终是导致溢出的原因,但同样,它在 PC 上运行良好。

看起来我可能只需要在构建 DLL 时调整堆栈大小?我相信在使用 Visual C 编译器时,CE 和 XP 的默认堆栈大小都是 1MB(如果重要的话,我使用的是 Visual Studio 2005)。如果它们都默认为相同的大小,我不确定为什么一个会溢出而另一个不会溢出。我尝试使用 /F 编译器标志和 /STACK 链接器标志调整堆栈大小,但这似乎没有任何作用。我也不完全清楚我可以在 DLL 中指定堆栈大小,而是可执行文件必须设置它。但如果是这种情况,我将如何调整我的托管进程在调用本机 DLL 时使用的堆栈大小?

4

1 回答 1

4

是讨论Windows CE 内存体系结构的链接。

最终,您几乎无法以编程方式或在编译时调整堆栈大小;操作系统将根据许多因素(包括内存可用性)对其进行更改。使用 /F 设置堆栈大小只会设置操作系统可以(并且通常会)忽略的默认值。无论如何,/F 对 .DLL 不起作用;它仅在编译可执行文件时有效。.DLL 没有堆栈;属于线程和(最终)属于进程。

可能是时候回到绘图板上删除递归了。

于 2009-04-08T22:19:35.027 回答