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?

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top