2009-04-08 106 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沒有堆棧;屬於線程和(最終)屬於該進程。

它可能是回到繪圖板去除遞歸的時候了。

相關問題