0

Je n'arrive pas à transmettre l'adresse du membre à une autre fonction. Voici ce que im essayant de faire:Passer l'adresse du membre de la classe correctement avec la possibilité de l'invoquer

J'ai la defention suivante:

bool MyClass::FunctionName(); 

puis quelque part dans mon programme, j'exécutez la commande suivante:

::SendMessage(hWnd, WM_NULL, (WPARAM)this, (LPARAM)&MyFunction); 

ce peuplements Pour MyClass

Une fois que mon WndProc est exécuté, j'essaie ceci:

LRESULT CALLBACK MyClass::WndProc(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam) 
{ 
    Myclass* pClass= (Myclass*)wParam; 

    std::function<bool()> pFunc = std::bind(bool(&Myclass::MyFunction)&lParam, pClass); 
    pFunc(); 
} 

erreurs im receving:

avertissement C4554: '&': vérifier la priorité des opérateurs d'erreur possible; utiliser parenthèses pour clarifier la priorité

Erreur 3 Erreur C2064: terme ne pas à une fonction prenant 1 arguments c: \ program files (x86) \ Visual Studio Microsoft 12.0 \ vc \ include \ xrefwrap 58

+0

Ne fais pas ça! Attendre qu'une procédure WPARAM d'une fenêtre soit un pointeur de classe se terminera par un désastre (notez que l'autre peut aussi appeler SendMessage) –

+0

@ DieterLuccking, la fonction WndProc suivante est en cours de sous-classement, je suis sûr que la vie de ma classe est assurée. –

+0

Le type s'appelle 'bool MyClass :: *()' et vous ne voulez pas l'adresse * de 'lParam'. – molbdnilo

Répondre

0

Eh bien cela devrait compiler:

LRESULT CALLBACK MyClass::WndProc(_In_ HWND hWnd, _In_ UINT uMsg, 
            _In_ WPARAM wParam, _In_ LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
     case WM_METHOD_CALL: 
      Myclass* pClass= static_cast<Myclass*>(wParam); 

      typedef bool Myclass::pmf(); 
      const auto pointer_to_member_function = static_cast<pmf>(lParam); 
      (pClass->*pointer_to_member_function)(); 
      break; 
    } 
} 

Votre problème est que si il est parfaitement sûr d'attendre un WPARAM être un pointeur de classe, un « pointeur vers une fonction membre » est une bête étonnamment complexe (envisager une Virtu al dans une deuxième classe de base), et est généralement plus grand qu'un seul pointeur - donc il ne rentre pas dans une LPARAM.

Étant donné que vous souhaitez utiliser SendMessage, vous pouvez effectuer les opérations suivantes:

Déplacez le typedef dans Myclass:

 typedef bool Myclass::pmf(); // Inside the definition of Myclass. 

Quelque part dans votre programme:

Myclass::pmf ptr = &MyFunction; 
::SendMessage(hWnd, WM_METHOD_CALL, (WPARAM)this, (LPARAM)&ptr); 

Ensuite, dans votre message gestionnaire:

LRESULT CALLBACK MyClass::WndProc(_In_ HWND hWnd, _In_ UINT uMsg, 
            _In_ WPARAM wParam, _In_ LPARAM lParam) 
{ 
    Myclass* pClass= static_cast<Myclass*>(wParam); 
    switch(uMsg) 
    { 
     case WM_METHOD_CALL: 
      do_method_call(wParam, lParam); 
      break; 
    } 
    return 0; // Or whatever. 
} 


void do_method_call(_In_ WPARAM wParam, _In_ LPARAM lParam) 
{ 
    const auto pointer_to_member_function = *static_cast<Myclass::pmf*>(lParam); 
    (pClass->*pointer_to_member_function)(); 
} 
+0

Le code doit activer l'ID de message.La fenêtre recevra des messages pour lesquels la distribution que vous utilisez dans la question est invalide et échouera. –

+0

@DavidHeffernan: Cru, oui! (Vous pouvez dire combien de temps il est depuis que j'ai écrit des fenêtres de production, code). –