Pb de callback

sebastienbro Messages postés 246 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 5 août 2004 - 25 juil. 2003 à 00:58
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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 !

Merci de votre aide

Bye

\* -- Seb [[mailto:sebastienbro@aol.com Mail]] [Web] -- */

2 réponses

cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
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.

Kaid - kaid.fr.st
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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...
0
Rejoignez-nous