Bonjour,
Je travaille sur la création d'un langage interprété qui sera utilisé comme support pour l'exécution de jeux vidéo, mais dont les fonctions multimédias ne seront pas implémentés par défaut dans le langage. Son interpréteur doit donc à terme supporter la gestion de plugins compilés sous forme de DLL qui permettront la gestion sonore, graphique, etc. Cela passe par l'appel de fonctions dont le prototype et les types de variables sont inconnus (mais le seront lors de l'interpréation grâce à des informations dans la string table des DLL). L'interpréteur est codé en C++, langage qui ne permet pas ce genre d'appels à ma connaissance. Pour ce faire, j'utilise donc le code assembleur suivant :
number = nombre de paramètres pour la fonction à appeler
parameters = pointeur vers un tableau contenant les pointeurs des variables utilisées en tant que paramètres de la fonction à appeler.
functionPtr = pointeur de la fonction à appeler, stockée dans une DLL chargée en mémoire.
returnValue = valeur retournée par la fonction exécutée.
Ce code est fonctionnel, il me permet bel et bien d'appeler la fonction que je souhaite utiliser et son exécution se fait avec les bons paramètres (en l'occurence, je testais avec l'ouverture d'une boîte de dialogue Win32). Néanmoins, le programme crashe juste après et le compilateur (Visual C++ Express 2005) m'affiche ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 mov ecx,number mov ebx,parameters dec ecx js appel boucle: push [ebx+ecx*4] dec ecx jns boucle appel: call functionPtr mov returnValue,eax
Et je n'arrive pas à me débarrasser de ce problème autrement qu'en appelant pas la fonction via le code assembleur.Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Quelle est l'erreur dans mon code ?
Partager