IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

[C++]Passage d'une fonction membre en callback à l'API Windows


Sujet :

C++/CLI

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2002
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 15
    Par défaut [C++]Passage d'une fonction membre en callback à l'API Windows
    Bonjour,

    Cette question doit être récurrente mais je n'ai pas trouvé une réponse compréhensible par mes connaissances en C++.

    Beaucoup de fonction de l'API Windows utilisent des callback.

    Je peux passer une fonction membre comme callback en la déclarant static.
    Mais j'ai besoin d'accéder à des données de l'instance de ma classe.
    Je comprends qu'en passant une fonction membre, cela ne respecte pas le prototype.
    Je ne dispose pas d'un paramètre permettant de passer l'instance de ma classe comme cela est mentionné dans cet article : http://cpp.developpez.com/faq/cpp/?p...onction_membre

    J'ai regardé boost ... mais je n'ai pas compris comment l'utiliser!

    Comment faire?

    Merci,

    Yves

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class Calibration
    {
    public:
    	Calibration(void);
    	~Calibration(void);
    	bool Initialize(HINSTANCE hInstance, HWND hWnd);
     
    private:
    	HWND	hWnd;
    	INT_PTR CALLBACK Initialize_CallBack(
                                        HWND hDlg, 
                                        UINT message,
                                        WPARAM wParam,
                                        LPARAM lParam);
     
    };
     
    INT_PTR CALLBACK Calibration::Initialize_CallBack(
              HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        // use of hWnd
    }
     
    bool Calibration::Initialize(HINSTANCE hInstance, HWND hWnd)
    {
    	this->hWnd = hWnd;
    	if (DialogBox( hInstance,
                               MAKEINTRESOURCE(IDD_DIALOG_DISPLAY_SIZE),
                               hWnd,
                               &Calibration::Initialize_CallBack) != IDOK){
    		return false;
    	}
    	return true;
    }

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    Tu peux transformer ta classe en singleton, ainsi tu pourra, au sein te ta callback, obtenir ton instance.
    L'inconvénient c'est que tu ne peux avoir qu'une seule instance de cette classe.
    Ou tu peux ajouter une variable static à ta classe dans laquelle tu place l'instance de ta classe avant l'appel de la callback. Mais la il va falloir sérieusement réfléchir aux éventuels problèmes de multi-threading (il ne faut surtout pas qu'un code quelque part écrase la valeur de te variable alors que tu n'a pas fini de t'en servir).

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 470
    Par défaut
    Je ne dispose pas d'un paramètre permettant de passer l'instance de ma classe
    Pouvez-vous nous indiquer quelle fonction de l'API Windows avec fonction de Callback aurait une erreur d'une taille aussi gigantesque.
    Je pense que vous avez mal lu la description de l'API.

Discussions similaires

  1. [Free Pascal] Enregistrer une fonction callback depuis une fonction membre
    Par EpiTouille dans le forum Free Pascal
    Réponses: 3
    Dernier message: 11/03/2015, 11h11
  2. Réponses: 2
    Dernier message: 25/02/2015, 22h12
  3. Réponses: 15
    Dernier message: 24/08/2010, 10h56
  4. Réponses: 3
    Dernier message: 28/11/2005, 12h15
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo