Pergunta
Enquanto navega algum código eu encontrei uma chamada para OpenPrinter () . A compila o código e funciona bem. Mas, estamos passando por uma HANDLE
vez de LPHANDLE
(conforme especificado no MSDN). Eu descobri que em windef.h
existe a seguinte declaração:
typedef HANDLE FAR *LPHANDLE;
O que LP representa? Devo usar um LPHANDLE
, ou HANDLE
sustento?
Solução
LP significa Long Pointer. É um ponteiro para uma alça neste caso.
HANDLE h = <winapi function>();
LPHANDLE ph = &h;
Você pode usá-lo da mesma forma que faria uma alça dereferenciando o ponteiro:
HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
Outras dicas
"LP" significa Long Pointer.
PEGA! = LPHANDLE, assim como DWORD! = DWORD * (ou LPDWORD)
FAR datas construto de volta aos dias do 8086/8088 CPU e os modais de memória segmentados que usados. Naqueles dias você poderia ter NEAR e FAR ponteiros para memória.
O LP (ponteiro longo) é apenas uma ressaca do Microsoft Hungarian Notation daqueles dias anteriores.
Hoje em dia o modelo de memória Win32 é plana, de modo NEAR e FAR ponteiros são basicamente os mesmos. Mas enquanto um próximo ponteiro é agora o mesmo que um muito poitner isso não significa que um ponteiro é o mesmo que uma alça.
E só para lhe dar um pouco de fundo longos ponteiros também chamados distantes ponteiros eram diferentes de 16 ponteiros normais bits em 16 bits do Windows. O sistema operacional utilizado um modelo de memória segmentado onde você iria compensar a partir de um segmento ou ter um segmento + offset que era um ponteiro longo. O LP notação húngara foi usado para esses longos ponteiros e ainda está cheio durante toda a API do Windows para essas razões legados.
Claro que no 32 bits e 64 bits do Windows OSs um modelo de memória plana é usada e não há distinção a ser feita entre os ponteiros nestes OSs (embora PAE acrescenta algo conceitualmente similar).