Newsgroup: it.comp.programmare.win32
Titolo: Come trovare l'handle del prog. in esecuzione?

 chiaro...
Una handle e` un "gettone opaco"; normalmente, un puntatore
a "qualcosa", dove tu sei tenuto a non preoccuparti a COSA punti.
Invece di un puntatore potrebbe essere un indice in una qualche
tabella, e` solo una questione di comodita` per l'implementatore.
Dal punto di vista dell'utilizzatore, non fa differenza, poiche` le
handle non si "trattano" mai in alcun modo, altro che ottenerle
da certe "API" e passarle alla fin fine ad altre "API".
L'esempio classico, in C standard, e` il "FILE*" che ti tornano
chiamate come fopen.  In Unix, l'equivalente open torna "un
piccolo numero intero" (chiaramente un indice in una qualche
tabella, ma a tutti gli effetti, un'handle anche quella); in Win32,
CreateFile torna una HANDLE (che sotto sotto e` un void*), e
l'effetto e` del tutto equivalente.
In C++ c'e` meno bisogno di questo idioma, di quanto non
ce ne sia in C; infatti, la "handle" puo` venire "incapsulata"
entro classi che la gestiscono per te; invece di chiamare delle
funzioni passando la handle come parametro, chiami dei
metodi su di un oggetto di una certa classe, che si tiene la
handle fra i dati privati di istanza.
Tuttavia, c'e` ancora spazio per questa design pattern (che
viene anche chiamata "token" o "cookie") sia pure in certi
contesti piu` limitati; ad esempio, la comunicazione fra
processi separati, che il linguaggio C++ non prende proprio
in considerazione, puo` ragionevolmente venire ancora
architettata in termini di token/cookie/handle.  Similmente,
un simile "gettone opaco" puo` rendere possibile delle
comunicazioni fra _linguaggi_ diversi, che in puri termini
di C++ potrebbero non essere fattibili.
Alex


In sintesi, questo è solo un grazie per le preziose informazioni sulle
funzioni specifiche.

 non di concreto. Come tale, è difficile da spiegare a parole, e potrò
Proviamo in concreto, allora.  Un'handle e` un mazzetto di 32 bit, che
viene ritornato da una certa funzione.  Il codice "cliente" di un certo
pacchetto di funzioni chiama una di esse, che gli torna una handle; poi,
passa l'handle come argomento ad altre di quelle funzioni.
Il significato, in dettaglio, di quei 32 bit, e` noto solo alla funzione che
li ha generati, e all'insieme di funzioni "sorelle", dello stesso pacchetto.
Spesso rappresenteranno un puntatore, oppure un indice in una tabella
che il pacchetto stesso si mantiene internamente.
Quel che sa il codice cliente e` che la handle gli rappresenta un oggetto
di un dato tipo, e puo` ottenere operazioni su quell'oggetto passando la
handle alle varie funzioni del pacchetto.  Il codice cliente non puo` fare
sulla handle nessuna operazione, eccetto passarla a funzioni di quel dato
pacchetto, punto.
Sinonimi di "handle" sono "token", "cookie", e altri.  Si parla anche
di "tipo opaco".
In C++ puro, non c'e` molto bisogno delle handle, o di funzioni raccolte
in pacchetti che hanno in comune il fatto di ricevere un argomento che
e` una handle.  Dove in C avrei un pacchetto di funzioni tipo, che so...:
    typedef struct ImpiegatoImplem* Handle_Impiegato;
    Handle_Impiegato ImpiegatoTrova(const char* nome);
    double ImpiegatoQuerySalario(Handle_Impiegato);
    const char* ImpiegatoQueryNome(Handle_Impiegato);
    ...
ecc ecc, in C++ avrei invece probabilmente:
    class Impiegato {
    public:
        double QuerySalario() const;
        const char* QueryNome() const;
        ...
        static Impiegato* Trova(const char* nome);
    };
e quindi mentre il codice cliente in C sarebbe del tipo:
    Handle_Impiegato hI = ImpiegatoTrova("Pippo");
    printf("%s guadagna %f $/anno\n",
        ImpiegatoQueryNome(hi),
        ImpiegatoQuerySalario(hi));
in C++ si avrebbe invece, equivalentemente:
    Impiegato* pI = Impiegato::Trova("Pippo");
    std::cout << pI->QueryNome() << " guadagna " <<
        pi->QuerySalario() << " $/anno \n";
Quindi, l'importanza delle handle in C++ si ha soprattutto
quando si devono chiamare pacchetti di funzioni pensate per
il C (e altri linguaggi non ad oggetti), come, ad esempio, le
API di Windows.
Meglio...?
Alex