2009-04-08 59 views
4

当我调用本机DLL时,从我的应用程序中收到臭名昭着的0xC00000FD(堆栈溢出)异常。这是从Windows CE 5(SH4处理器)上的托管C#应用程序完成的。使用相同的托管应用程序为Windows XP编译相同的DLL,并且一切正常(无溢出)。 DLL中的例程正在做一些非常复杂的递归,最终导致溢出,但它再次在PC上工作正常。从托管应用程序调用的本地DLL中调用堆栈溢出

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

回答

4

这是Windows CE的a discussion of the memory architecture的链接。

最终,您可以通过编程或编译时调整堆栈大小的方法很少;操作系统会根据许多因素(包括内存可用性)来改变它。使用/ F设置堆栈大小只会设置一个默认值,该值可以(且通常会)被操作系统忽略。无论如何,/ F在.DLL上不起作用;它只在编译可执行文件时才起作用。 .DLL没有堆栈;属于线程和(最终)属于该进程。

它可能是回到绘图板去除递归的时候了。

相关问题