sebastienbro
Messages postés246Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention 5 août 2004
-
25 juil. 2003 à 00:58
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
25 juil. 2003 à 10:38
Voilà, j'ai créé une DLL dont une fonction demande en paramètre une callback.
Voici comment j'ai défini la callback :
typedef struct _TCallBackRec {
int Action;
int Tbl;
float Progression;
int TempEcoule;
} TCallBackRec, *PCallBackRec;
typedef int (WINAPI *TWPCallBack)(const TCallBackRec Arg);
Donc le programme qui appel cette dll est en delphi.
voici la callback :
type TWPCallBacl = function(const Arg: TCallBackRec): Integer; stdcall;
Dès le premier appel de la callback, il se passe sans erreur, sauf qu'au moment du retour, vc++ (version 6) me met un message d'erreur :
Msg : "Debug error !
File: i386\chkesp.c
Line 42
The value of ESP was not properly saved across a fonction 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"
Voilà, je ne comprend pas pourquoi j'ai ce message. J'ai pourtant bien mis stdcall; en delphi, mais j'ai toujours ce message !
Lors du deuxieme appel, mon prog plante, c'est là que je compren plus !
cs_Kaid
Messages postés949Date d'inscriptionmardi 2 octobre 2001StatutMembreDernière intervention 8 juillet 20061 25 juil. 2003 à 10:20
Ton problème vient certainement du fait que le Pascal et le C n'utiilisent pas les mêmes conventions pour l'appel de fonctions.
Les paramètres de la fonction sont PUSHés pour être transmis au CALL. Il faut ensuite ré-équilibrer la pile, c'est-à-dire supprimer de la pile tous ces paramètres après le CALL. La convention d'appel de fonctions en C, ré-équilibre la pile à la sortie du CALL (dans le RET) alors que pour la convention Pascal, c'est à l'appelant de le faire (ré-ajustement du stack pointer après le CALL). Je suis sûr des mécanismes mais il est possible que je me sois trompé entre conventions C et Pascal.
Pour corriger ton problème, soit changer la déclaration de la fonction (WINAPI) soit changer la déclaration dans Delphi.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 25 juil. 2003 à 10:38
Dans le standard C c'est celui qui 'PUSH' qui remonte ESP.
Avec stdcall (WINAPI) c'est la fonction appelee qui remonte ESP par: ret nbrParams*4
BruNews, ciao...