Domanda
Durante la navigazione un po 'di codice che ho trovato una chiamata a OpenPrinter () . Il codice compila e funziona bene. Ma, stiamo passando un HANDLE
invece di LPHANDLE
(come specificato nel MSDN). Ho scoperto che in windef.h
esiste la seguente dichiarazione:
typedef HANDLE FAR *LPHANDLE;
Che cosa significa per LP? Dovrei usare un LPHANDLE
, o di tenere HANDLE
?
Soluzione
LP sta per lungo Pointer. E 'un puntatore ad una maniglia in questo caso.
HANDLE h = <winapi function>();
LPHANDLE ph = &h;
Si può usare lo stesso metodo utilizzato per una maniglia dereferenziazione il puntatore:
HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
Altri suggerimenti
"LP" sta per puntatore lungo.
gestire! = LPHANDLE, proprio come DWORD! = DWORD * (o LPDWORD)
Il FAR la costruzione risale ai giorni del 8086/8088 CPU e le modali memoria segmentata che ha usato. In quei giorni si potrebbe avere NEAR e FAR puntatori a memoria.
Il LP (indicatore lungo) è solo una sbornia dalla Microsoft ungherese notazione da quei giorni precedenti.
In questi giorni il modello di memoria Win32 è piatta in modo da VICINO e FAR i puntatori sono fondamentalmente la stessa. Ma mentre una nei pressi di puntatore è ora lo stesso di un far poitner questo non significa che un puntatore è lo stesso di una maniglia.
E proprio per darvi un po 'di storia lungo puntatori chiamati anche i puntatori erano differenti rispetto ai normali 16 puntatori bit in 16 bit di Windows. Il sistema operativo utilizzato un modello di memoria segmentata dove si sarebbe compensato da un segmento o di avere un segmento + offset, che è stato un lungo puntatore. La notazione ungherese LP è stato utilizzato per questi lunghi puntatori ed è ancora disseminato in tutta l'API di Windows per questi motivi legacy.
Naturalmente nel 32 bit e 64 bit di Windows sistemi operativi un modello di memoria piatta viene utilizzato e non v'è alcuna distinzione tra i puntatori a questi sistemi operativi (anche se PAE aggiunge qualcosa di concettualmente simile).