[c++] pointer to callback function

di ilgiova il
3 risposte
Sto cercando di usare la funzione EnumWindowStations della libreria WinUser.h ma non riesco a passargli il puntatore alla funzione callback che ho creato. Cioè non mi è chiaro come debba farlo e non riesco a chiarirmi le idee su questo punto nonostante mi sono studiato un po' i riferimenti a tale funzione ( https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumwindowstationsw )

Segue il codice così forse è più comprensibile ciò che non capisco:

codice:
BOOL CALLBACK CWinLogon::EnumWindowStationProc(__in  LPWSTR lpszWindowStation,__in  LPARAM lParam)
{
    ...
    return true;
}
void MyFunction()
{
   if ( EnumWindowStations(&EnumWindowStationProc, NULL) )                
      home_window_station  = 0;
}
Il compilatore mi dice

l'argomento di tipo "BOOL (__stdcall *)(LPWSTR lpszWindowStation, LPARAM lParam)" è incompatibile con il parametro di tipo "WINSTAENUMPROCW"


ora andando a vedere le definizioni sul file WinUser.h
codice:
typedef BOOL (CALLBACK* NAMEENUMPROCW)(LPWSTR, LPARAM);
typedef NAMEENUMPROCW   WINSTAENUMPROCW;
typedef WINSTAENUMPROCW     WINSTAENUMPROC;
A questo punto mi areno, non riesco a capire come passare la funzione EnumWindowStationProc a EnumWindowStations.
Qualcuno può chiarirmi le idee?
Grazie mille

3 Risposte

  • Ok, soluzione trovata!
    (Per i posteri)
    Bisognava dichiarare la funzione EnumWindowStationProc static !
  • Ma la domanda e': PERCHE'?

    Risposta 'rapida' : l'API richiede un puntatore a 'funzione'.

    Un metodo NON E' equivalente ad una funzione perche' riceve, in modo 'nascosto', il parametro 'this' che poi tu usi nell'implementazione.

    Invece un metodo statico, non ricevendo nessun parametro extra, si comporta ESATTAMENTE come una funzione.

    Da cui la soluzione del tuo problema
  • Grazie per la spiegazione, il c++ è sempre molto "permaloso" il codice l'avevo tradotto da Delphi e quindi non mi è venuto "naturale" pensarci. Poi gli esempi che avevo trovato non menzionavano nessun metodo static, ci sono dovuto arrivare sbattendoci un po' il grugno !
Devi accedere o registrarti per scrivere nel forum
3 risposte