[c++] pointer to callback function

di il
3 risposte

[c++] pointer to callback function

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

  • Re: [c++] pointer to callback function

    Ok, soluzione trovata!
    (Per i posteri)
    Bisognava dichiarare la funzione EnumWindowStationProc static !
  • Re: [c++] pointer to callback function

    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
  • Re: [c++] pointer to callback function

    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