2009-04-08 13 views
4

Ich bekomme die berüchtigte 0xC00000FD (Stapelüberlauf) Ausnahme von meiner Anwendung, wenn ich in eine native DLL aufruft. Dies geschieht aus einer verwalteten C# -Anwendung unter Windows CE 5 (SH4-Prozessor). Kompilieren der gleichen DLL für Windows XP mit der gleichen verwalteten Anwendung und alles funktioniert gut (kein Überlauf). Die Routine in der DLL führt eine sehr komplexe Rekursion durch, was letztendlich den Überlauf verursacht, aber wiederum funktioniert es auf einem PC gut.Stapelüberlauf von nativer DLL, die von verwalteter Anwendung aufgerufen wird

Es sieht so aus, als müsste ich beim Erstellen der DLL vielleicht nur die Stackgröße anpassen? Ich glaube, dass die Standard-Stack-Größe für CE und XP beide 1 MB sind, wenn Sie den Visual C-Compiler verwenden (ich verwende Visual Studio 2005, wenn das wichtig ist). Wenn beide auf die gleiche Größe voreingestellt sind, bin ich mir nicht sicher, warum einer überläuft und der andere nicht. Ich versuchte, die Stapelgröße mit dem/F-Compiler-Flag und dem/STACK Linker-Flag anzupassen, aber das schien nichts zu tun. Es ist mir auch nicht ganz klar, dass ich die Stackgröße in einer DLL angeben kann, sondern die ausführbare Datei muss sie setzen. Aber wenn das der Fall ist, wie würde ich die Stapelgröße anpassen, die von meinem verwalteten Prozess beim Aufrufen der nativen DLL verwendet werden soll?

Antwort

4

Hier ist ein Link zu a discussion of the memory architecture von Windows CE.

Schließlich können Sie die Stapelgröße programmatisch oder zur Kompilierzeit nur sehr wenig anpassen. Das Betriebssystem variiert es basierend auf einer Reihe von Faktoren, einschließlich der Speicherverfügbarkeit. Wenn Sie die Stapelgröße mit/F festlegen, wird nur ein Standardwert festgelegt, der vom Betriebssystem ignoriert werden kann (und häufig wird). Und/F funktioniert auf einem .DLL sowieso nicht; Es funktioniert nur beim Kompilieren der ausführbaren Datei. .DLLs haben keinen Stapel; das gehört zum Thread und (letztendlich) zum Prozess.

Es könnte Zeit sein, zum Zeichenbrett zurückzukehren, um die Rekursion zu entfernen.

Verwandte Themen