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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top