J'essaie de faire un appel à une fonction DLL (via GetProcAddress etc) à partir de C, en utilisant le compilateur lcc. La fonction est appelée et tout se passe bien, mais il semble que le haut de la pile soit corrompu. J'ai essayé de jouer avec des conventions d'appel (__stdcall/__cdecl), mais cela n'a pas aidé.corruption de pile étrange en raison d'un appel dll
Malheureusement, je n'ai pas accès au code dll, et je dois utiliser le compilateur lcc.
Je trouve que cette simple astuce évite la corruption de la pile:
void foo(params)
{
int dummy;
dll_foo(params);
}
Ici dll_foo est le pointeur retourné par GetProcAddress et la pile est une sorte de protection par la variable factice. Ce n'est donc pas le pointeur de pile qui est corrompu, mais les données en haut de la pile. Cela fonctionne comme ça, mais j'aimerais savoir la raison de la corruption.
Des idées?
UPD: Comme demandé dans les commentaires, voici les types de fonction réelle:
typedef unsigned char (CALLBACK Tfr)(unsigned char);
typedef void (CALLBACK Tfw)(unsigned char,unsigned char);
typedef int (CALLBACK Tfs)(int);
typedef void (CALLBACK Tfwf)(int*,int);
Tout ce qu'ils montrent un comportement similaire.
Malheureusement, il n'est pas si simple d'attacher un débogueur, car le code est compilé et lancé par Matlab, en utilisant le compilateur LCC, et il n'y a pas de support de débogage. Probablement je devrai reproduire ce problème dans une configuration autonome, mais ce n'est pas si facile de le faire.
Je suis d'accord concernant la déclaration du pointeur de fonction. –
Non, j'utilise lcc et je ne sais pas comment attacher un débogueur (le compilateur est appelé par Matlab en fait).Les fonctions sont définies comme suit: "typedef unsigned char (CALLBACK Type_foo) (caractère non signé); Type_foo * foo;", il y en a quelques-uns avec des arguments différents, mais tous affichent le même comportement. Qu'est-ce qui est pour ESP, si c'était faux alors je suppose que mon hack ne fonctionnerait pas ... –
Eh bien, écrivez un petit programme de test afin que vous puissiez réellement déboguer cela. –