Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [win32] Impossibile convertire da INT_PTR CALLBACK a DLGPROC
Forum - C/C++ - [win32] Impossibile convertire da INT_PTR CALLBACK a DLGPROC

Avatar
Exor (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/08/2009

Segnala al moderatore
Postato alle 22:03
Venerdì, 05/03/2010
salve forum :)

ho questa classe:

Codice sorgente - presumibilmente C/C++

  1. class MainDlg {
  2.                 public:
  3.                         MainDlg();
  4.                         MainDlg(HINSTANCE hInstance, LPTSTR lpTemplate, HWND hParent);  // costruttore
  5.                         void OnInitDlg(HWND hDlg);      // on dialog init
  6.                         INT_PTR CALLBACK MainDlgProc(HWND, UINT, WPARAM, LPARAM);
  7.                 private:
  8.                         HWND hDlg;
  9.         };



nel costruttore MainDlg(HINSTANCE hInstance, LPTSTR lpTemplate, HWND hParent); io cerco di inizializzare una dialog:
Codice sorgente - presumibilmente C/C++

  1. MainDlg::MainDlg(HINSTANCE hInstance, LPTSTR lpTemplate, HWND hParent)
  2. {
  3. // HWND nRes; var d'appoggio
  4.  
  5.         nRes = DialogBox(hInstance, lpTemplate, hParent, &MainDlg::MainDlgProc);
  6.         if (nRes)
  7.                 hDlg = (HWND)nRes;
  8. }



come quarto parametro della macro DialogBox dovrei dare un valore DLGPROC, che dato come funzione normale, non ci sono problemi, ma dato come membro di una classe il compiler mi da errore:

Codice sorgente - presumibilmente C/C++

  1. error C2664: 'DialogBoxParamA': impossibile convertire il parametro 4 da 'INT_PTR (__stdcall ExAppNS::MainDlg::* )(HWND,UINT,WPARAM,LPARAM)' a 'DLGPROC'



mi potreste aiutare a capire come mai non funziona ?

grazie :)

PS: dimenticavo di dire che neanche con un cast riesco a risolvere.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 22:15
Venerdì, 05/03/2010
un puntatore a funzione differisce da un puntatore a membro per una sottile, ma sostanziale, differenza.

La chiamata a membro presuppone il passaggio (implicito) del puntatore "this".

Es:
Codice sorgente - presumibilmente Plain Text

  1. Classe miaClasse;
  2. miaClasse.chupa();



il metodo chupa() sembrerebbe non avere alcun parametro in input, ma in realtà il compilatore inserisce (a tradimento) un parametro in questo modo:

Codice sorgente - presumibilmente Plain Text

  1. Classe miaClasse;
  2. Classe *puntatoreThis;
  3. puntatoreThis = &miaClasse;
  4. chupa(puntatoreThis);



Questo significa che la chiamata a membro non può avvenire se non esiste un "this" da passare come primo parametro. Infatti in C++, se vuoi chiamare un puntatore a metodo, devi prima associarlo ad una istanza di classe del tipo corretto.
Nel caso specifico della tua domanda, credo non ci sia nulla da fare. La libreria si aspetta un puntatore a funzione "classico", perchè internamente non effettua nessuna associazione classe/funzione, quindi non avrebbe nessun "this" da passargli, e la chiamata non potrebbe avere luogo.

Rassegnati ad usare un normale puntatore a funzione in questo caso :)

Ciao!


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:34
Venerdì, 05/03/2010
A seconda dell'utilizzo che ne farai, potresti risolvere dichiarandola static

static INT_PTR CALLBACK MainDlgProc(HWND, uint, WPARAM, LPARAM);


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Dax89 (Member)
Expert


Messaggi: 283
Iscritto: 07/04/2007

Segnala al moderatore
Postato alle 10:45
Sabato, 06/03/2010
Questo è un problema tipico, conosco molte persone che usano le WinAPI e il C++ per fare un programma visuale utilizzando le classi, tutti si scontrano con questo problema, per "aggirarlo" c'è un piccolo trick:

Nella tua classe MainDlg oltre alla window procedure statica ne aggiungi un'altra non statica, il trick è semplice, fai in modo che la window procedure statica richiami quella non statica, salvando il "this" per recuperarlo in seguito e chiamando la funzione "wndProc" non statica.

Cambia la chiamata da DialogBox a CreateDialog, questa funzione (a differenza di DialogBox) ti restituisce l'handle della finestra che hai appena creato, il motivo si vedrà poco più sotto.

Quindi:

Codice sorgente - presumibilmente C/C++

  1. MainDlg::MainDlg(HINSTANCE hInstance, LPTSTR lpTemplate, HWND hParent)
  2. {
  3.    /*
  4.     * La variabile hWnd la puoi mettere come membro privato della classe
  5.     * così è accessibile ad ogni funzione.
  6.     */
  7.  
  8.    HWND hWnd = CreateDialog(hInstance, lpTemplate, hParent, &MainDlg::msgRouter);
  9.    
  10.    // Salvi l'istanza della classe.
  11.    SetWindowLongPtr(hWnd, GWL_USERDATA, (LONG)this);
  12. }
  13.  
  14. /*
  15.  * Questa è la window procedure statica che passerai alla funzione CreateDialog
  16.  */
  17. BOOL MainDlg::msgRouter(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  18. {
  19.   //Recuperi l'istanza della classe.
  20.   MainDlg* pDlg = (MainDlg*)GetWindowLongPtr(hWnd, GWL_USERDATA);
  21.  
  22.   if(pDlg)
  23.   {
  24.     /*
  25.      * Chiamata alla Window Procedure non Statica
  26.      */
  27.     return pDlg->wndProc(hWnd, msg, wParam, lParam);
  28.   }
  29.  
  30.   return FALSE;
  31. }
  32.  
  33. /*
  34.  * Questa è la window procedure NON statica (chiamata da quella statica)
  35.  * quì gestisci gli eventi.
  36.  */
  37. BOOL MainDlg::wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  38. {
  39.     /*
  40.      * Gestisci i tuoi messaggi e accedi alle informazioni non statiche
  41.      * della classe.
  42.      */
  43. }



Spero sia chiaro quello che ho scritto :rofl:
:k:

Ultima modifica effettuata da Dax89 il 06/03/2010 alle 11:12


PM Quote
Avatar
Exor (Normal User)
Rookie


Messaggi: 30
Iscritto: 29/08/2009

Segnala al moderatore
Postato alle 12:14
Sabato, 06/03/2010
Testo quotato


.
.
.
Spero sia chiaro quello che ho scritto :rofl:
:k:



:) grazie mille

stavo pensando ad un trick del genere auhuauh ma non c'ero arrivato ancora

grazie mille per l'info

PM Quote