[C/C++] callback d'une methode C++ en C

callback d'une methode C++ en C [C/C++] - Programmation

Marsh Posté le 20-03-2001 à 13:03:39    

Voila. Je cherche à faire un truc simple (pour ensuite l'intégrer dans un truc plus gros) :
 
Appeler une méthode C++ en C. J'ai trouvé un truc qui le fait. Mais ca correspond pas à ce dont j'ai besoin. Puisque le prototype en C est figé (pointeur de fonction utilisant une callback dans Win32).
 
Voici un exemple de code qui marche pas :
 
class tstCPP {
public:
 inline tstCPP() {}
 inline ~tstCPP() {}
 
 void setValue(const int i_val);
 
 int getValue(void);
 
private:
 int val;
};
 
void test(int (*i_func)(void)) {
 printf("%d\n",i_func());
}
 
void main(void) {
 tstCPP c1,c2;
 
 c1.setValue(10);
 c2.setValue(23);
 
 test(c1.getValue);
 test(c2.getValue);
}
 
En gros le prototype de la fonction test est figé, et j'aimerai arriver à lui donner qqchose (comme pointeur de fonction) qui corresponde bien à un truc différent suivant l'instance de l'objet...

Reply

Marsh Posté le 20-03-2001 à 13:03:39   

Reply

Marsh Posté le 20-03-2001 à 13:04:14    

Désolé pour l'indentation...

Reply

Marsh Posté le 20-03-2001 à 13:33:56    

Un début de réponse à cette adresse (en anglais) :
 
http://www.mvps.org/windev/cpp/class.html

Reply

Marsh Posté le 20-03-2001 à 14:13:04    

comprends rien....
c quel prototype est figé????
c'est lequel que tu voudrais changer???
pas claire, ta question...

Reply

Marsh Posté le 20-03-2001 à 15:16:19    

Désolé?
En fait le type de la fonction C "test" est figé (dans cet example non, mais en fait mon but est de faire des callback pour Windows). Donc j'essaie de passer une méthode en pointeur de fonction.
 
Après diverses recherches, il semble que ce soit impossible, parce qu'en fait le compilateur (tous?) ajoute dans la liste des paramètres "this" pour une méthode C++. En C il est donc impossible de passer cette méthode comme Callback. J'ai lu ca sur plusieurs sites différents...
 
Pour mon pb sous Windows, une solution peut-être d'utiliser la classe CWinApp des MFC. Mais comme je veux pas utiliser les MFC, je vais essayer de me débrouiller autrement... Déjà la classe CWindow (pas MFC je pense) m'aidera bien à rendre du code C++ mélangé avec du C (MeuhMeuhTV) en un meilleur code C++.
 
:D

Reply

Marsh Posté le 20-03-2001 à 15:29:00    

Les fonctions membres statiques n'ont pas besoin de "this".

Reply

Marsh Posté le 20-03-2001 à 15:43:57    

Bon, alors sous windows il est impossible qu'une fonction membre soit une callback car elle ne respecte pas la convention d'appel.
 
Sous win, la convention d'appel d'une call back est:
 
type_retour (__stdcall *)( int toto1, etc...)
 
donc le type de retour est celui que tu veux, les arguments sont ceux que tu veux...
 
Ce qu'il est possible de faire, et c'est ce que moi je fais, c'est que tu déclare une fonction externe ( qui a cette convention d'appel ) comme amie de la classe. Et tu passes à cette fonction un pointeur sur l'objet.
Un exemple pour être plus clair:
 
 
//header: toto.h
 
 
class toto
{
//....
    int a;
 
private:
    maFonction1(int i);
    friend void __stdcall myCallBack( void * data, void * ptr );
};
 
// dans le fichier toto.cpp
 
 void __stdcall myCallBack( void * data, void * ptr )
{
//....
    (toto *) ptr->maFonction1(  (toto *) ptr->a );
//....
}
 
 
 
// et dans ton programme principal:
typedef void (__stdcall * CALLBACK_TYPE) ( void * data, void * ptr )
 
void main(void)
{
toto * t;
 
t=new toto();
 
CALLBACK_TYPE callback = tu_te_debrouille_pour_recupperer_laddresse_de_la_callback;
 
callback( NULL, t);
 
}

Reply

Marsh Posté le 20-03-2001 à 16:13:54    

Et comment tu fais si tu dois utiliser une fonction callback procedure de fenetre (type WndProc)???  
Je veux dire :  
tu fais un createwindow() dans une classe (ex: classe de creation de fenetre), tu dois lui passer le nom d'une fonction callback. Si tu veux que cette callback soit une fonction de cette classe, tu fais comment ???

Reply

Marsh Posté le 20-03-2001 à 16:57:06    

Pour le WinProc, je dirais
 
class toto {
//...
private :
  friend WNDPROC myCallBack;
//...
}

Reply

Marsh Posté le 20-03-2001 à 17:10:36    

M'enfin cette solution ne fonctionne pas, puisque dans le cas de Windows, je ne maitrise pas les prototypes des callback !
 
M'enfin il y a une bidouille qui consiste à passer en lParam un pointeur sur l'objet. Et dans ce cas (callback Windows) ca fonctionne !

Reply

Marsh Posté le 20-03-2001 à 17:10:36   

Reply

Marsh Posté le 20-03-2001 à 17:11:19    

PS: J'ai testé WNDPROC myCallBack, ca marche po...

Reply

Marsh Posté le 20-03-2001 à 18:41:05    

> Et comment tu fais si tu dois utiliser une fonction callback procedure de fenetre (type WndProc)???  
 
Dans le cas de cette callback, tu es obligé d'envoyer un message windows (avec les LParam etc...)
 
Normalement, tu as une callback par default, mais tu peux faire un mapping de la tienne...
J'ai pas d'exemple sous la main, mais c sur que ca fonctionne puisque je l'ai deja fais.

Reply

Marsh Posté le 13-11-2001 à 21:23:39    

moi aussi j'ai ce pb !!
 
mais j'utilise la fonction SetWindowsHookEx();
 
et je peux pas rajouter de parametre suplémentaire :( en LPARAM :(

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed