Sovraccarico dello stack da una DLL nativa chiamata dall’applicazione gestita

Ricevo l’infame eccezione 0xC00000FD (stack overflow) dalla mia applicazione quando richiamo una DLL nativa. Questo viene eseguito da un’applicazione C # gestita su Windows CE 5 (processore SH4). Compilare la stessa DLL per Windows XP utilizzando la stessa applicazione gestita e tutto funziona correttamente (nessun overflow). La routine nella DLL sta eseguendo una ricorsione molto complessa che alla fine sta causando l’overflow, ma, di nuovo, funziona bene su un PC.

Sembra che possa essere sufficiente regolare le dimensioni dello stack durante la creazione della DLL? Credo che le dimensioni dello stack predefinite per CE e XP siano entrambe di 1 MB quando si utilizza il compilatore Visual C (sto utilizzando Visual Studio 2005, se questo è importante). Se entrambi hanno l’impostazione predefinita alle stesse dimensioni, non sono sicuro del motivo per cui l’overflow e l’altro no. Ho provato ad aggiustare la dimensione dello stack con il flag del compilatore / F e il flag linker / STACK ma non sembrava che facesse nulla. Inoltre, non è del tutto chiaro per me che posso specificare la dimensione dello stack in una DLL, ma piuttosto che l’eseguibile deve impostarlo. Ma se è così, come posso regolare la dimensione dello stack per il mio processo gestito da utilizzare quando si chiama nella DLL nativa?

Ecco un collegamento a una discussione sull’architettura della memoria di Windows CE.

In definitiva, c’è ben poco da fare per regolare le dimensioni dello stack a livello di codice o in fase di compilazione; il sistema operativo varierà in base a una serie di fattori, tra cui la disponibilità di memoria. L’impostazione della dimensione dello stack con / F imposta solo un valore predefinito che può (e spesso lo sarà) essere ignorato dal sistema operativo. E / F non funziona su una DLL, comunque; funziona solo durante la compilazione dell’eseguibile. . DLL non hanno una pila; quello appartiene al thread e (in definitiva) al processo.

Potrebbe essere il momento di tornare al tavolo da disegno per rimuovere la ricorsione.