begin process at 2012 05 29 17:56:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Pb de callback


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pb de callback

vendredi 25 juillet 2003 à 00:58:50 | Pb de callback

sebastienbro

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 [Mail] [Web] -- */
vendredi 25 juillet 2003 à 10:20:38 | Re : Pb de callback

Kaid

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

-------------------------------
Réponse au message :
-------------------------------

> 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 [Mail] [Web] -- */
vendredi 25 juillet 2003 à 10:38:46 | Re : Pb de callback

BruNews

Administrateur CodeS-SourceS
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...


-------------------------------
Réponse au message :
-------------------------------

> 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
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > 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 [Mail] [Web] -- */
>


Cette discussion est classée dans : int, appel, url, callback, tcallbackrec


Répondre à ce message

Sujets en rapport avec ce message

Templates persos [ par nicolas66 ] Bonjour tlm,j'ai écrit une classe Matrix en template permettant de manipuler aussi bien des int, des double, ou autre ... Mais en maths, il existe aus INT TO CHAR [ par nicolas66 ] Salut tlm c encore moi ..cette fois-ci j'aimerai convertir un int en char mais je n'y arrive pas :(. J'ai essayé de faire comme sur une source sur le Intercepter l'appel d'un API [ par sebastienbro ] Bonjour,j'aurais voulus savoir s'il était possible d'intercepter l'appel d'un api, un peu comme un breakpoint dans softice, ou dans n'importe quel déb SHBrowseForFolder [ par grandmach ] Bonjour,J'essaie d'afficher une fenetre de séléction de répertoire avec SHBrowseForFolder mais je n'arrive pas à changer le titre de la fenetre (dans C++ : Appel d'un autre constructeur de la classe [ par ymca2003 ] Salut, j'ai un petit problème pour appeler un autre constructeur d'une classe. Ex :// constructeur 1CMyClass::CMyClass(int x, int y){...}// constructe Pointeur sur fonction ? [ par tintin72 ] Bonjour, J'ai un petit souci avec les pointeurs sur fonction. Voilà, j'ai une fonction qui prend comme argument un pointeur sur fonction: void maFonct INT_PTR CALLBACK ou BOOL APIENTRY [ par Guillemouze ] salut a tous, j'ai juste quelques petites questions. je voudrai savoir ce qu signifie INT_PTR CALLBACK et BOOL APIENTRY, dans quels cas utiliser l'un implementation d'une fonction callback pour l'appel à une DLL [ par 3asfoura ] Hi all!J'utilise visual c++ 6.0.J'ai une DLL client dont je connais seulement les noms de fonctions visualisés sous "Dependency walker". Je veux imple Appel d'une fonction [ par anisj1m ] Bonjour;je suis un développeur java et je vais utiliser une bibliothèque écrite en c, puisque je ne suis pas expert en C, j'ai trouvé certaines ambigu Appel fonction avec GTK+ [ par ptityo31 ] Bonjour,je débute sur GTK+, et j'aimerai avoir des précisions sur le lancement d'une application à partir d'un clic.En effet je dois envoyer des trame


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,390 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales