2009-04-08 9 views
4

Je reçois l'exception 0xC00000FD (débordement de pile) de mon application lorsque j'appelle une DLL native. Ceci est fait à partir d'une application C# gérée sur Windows CE 5 (processeur SH4). Compilation de la même DLL pour Windows XP en utilisant la même application gérée et tout fonctionne bien (pas de débordement). La routine dans la DLL fait une récursion très complexe qui est en fin de compte ce qui provoque le débordement, mais encore une fois, cela fonctionne très bien sur un PC.Dépassement de pile de la DLL native appelée à partir de l'application gérée

Il semble que je puisse juste besoin d'ajuster la taille de la pile lors de la construction de la DLL? Je crois que la taille de pile par défaut pour CE et XP sont à la fois 1 Mo en utilisant le compilateur Visual C (j'utilise Visual Studio 2005, si cela est important). Si les deux ont la même taille par défaut, je ne sais pas pourquoi l'un déborderait et l'autre ne le ferait pas. J'ai essayé d'ajuster la taille de la pile avec le drapeau du compilateur/F et le drapeau de l'éditeur de liens/STACK mais cela n'a pas semblé faire quoi que ce soit. Il n'est également pas tout à fait clair pour moi que je peux spécifier la taille de la pile dans une DLL, mais plutôt l'exécutable doit le définir. Mais si tel est le cas, comment ajuster la taille de la pile pour mon processus managé à utiliser lors de l'appel dans la DLL native?

Répondre

4

Voici un lien vers a discussion of the memory architecture de Windows CE. En fin de compte, il y a très peu de choses que vous pouvez faire pour ajuster la taille de la pile par programmation ou au moment de la compilation; le système d'exploitation va le modifier en fonction d'un certain nombre de facteurs, y compris la disponibilité de la mémoire. La définition de la taille de la pile avec/F définit uniquement une valeur par défaut qui peut (et sera souvent) ignorée par le système d'exploitation. Et/F ne fonctionne pas sur un .DLL, de toute façon; cela ne fonctionne que lors de la compilation de l'exécutable. Les DLL ne possèdent pas de pile. cela appartient au fil et (finalement) au processus.

Il est peut-être temps de revenir à la planche à dessin pour supprimer votre récursivité.