Dereferenziazione puntatore C ++
-
12-10-2019 - |
Domanda
Ho appena riuscito a scrivere un hook globale CBT in C ++, utilizzabile con C #. Può sembrare stupido, ma la mia conoscenza dei puntatori e dereferencing di chi è molto male a causa del mio lavoro con C #.
Non sono in grado di risolvere il riferimento di un puntatore all'interno di una struct puntato dal lParam.
Ecco come si presenta: il lParam è un lungo puntatore ad una struct CBT_CREATEWND, che a sua volta detiene un membro "LPC", e un puntatore a un CREATESTRUCT. Questo struct contiene un membro "x", che voglio leggere. Ho provato quanto segue, ma ottengo valori non validi per x:
CREATESTRUCT str = *(LPCREATESTRUCT)(((LPCBT_CREATEWND)lParam)->lpcs);
int normal = str.x;
PostMessage(FindWindow(NULL, L"Process Watcher Window"), RegisterWindowMessage(L"ALEXX_SEINE_WNDMESSAGE_C"), wParam, normal);
qualcuno potrebbe Please help me?
Soluzione
Il tuo sintassi sembra check-out, anche se è forse un po 'illeggibile, e il cast LPCREATESTRUCT
è ovviamente inutile.
Lei ha detto che si ottiene valori non validi per x
, forse lParam
in realtà non è un puntatore ad una struttura CBT_CREATEWND
? Stai controllando che nCode
della funzione di callback è pari a HCBT_CREATEWND
prima del getto lParam
?
Altri suggerimenti
Beh non posso davvero parlare verso i piccoli dettagli perché si ottiene valori x non validi, ma vorrei probabilmente scrivere questo codice in modo diverso:
// the way you had it, it was making a copy of the CREATESTRUCT and storing it in str
// this just uses a pointer
LPCREATESTRUCT str = ((LPCBT_CREATEWND)lParam)->lpcs;
// when you have a pointer, use -> to use a member
int normal = str->x;
Dal momento che hai detto che siete nuovi a puntatori, spiegherò ->
un po '. Quando si scrive x->y
, è davvero lo stesso di (*x).y
ma con la sintassi più bello.
Anche una nota del consiglio, mentre i calchi in questo codice sembrano ragionevoli. In generale, se si scopre che si sta casting molto, probabilmente state facendo sia il modo più difficile, o nel modo sbagliato. Quindi assicuratevi di prendere il tempo di capire eventuali calchi che si fa.