在浏览某些代码时,我发现了对OpenPrinter()的调用。代码编译并正常工作。但是,我们正在传递HANDLE
而不是LPHANDLE
(在MSDN中指定)。我发现在windef.h
中存在以下声明:
typedef HANDLE FAR *LPHANDLE;
LP代表什么?我应该使用LPHANDLE
,还是保留HANDLE
?
答案 0 :(得分:7)
“LP”代表Long Pointer。
HANDLE!= LPHANDLE,就像DWORD一样!= DWORD *(或LPDWORD)
答案 1 :(得分:6)
LP代表Long Pointer。在这种情况下,它是指向句柄的指针。
HANDLE h = <winapi function>();
LPHANDLE ph = &h;
您可以通过取消引用指针来使用它,就像处理指针一样:
HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
答案 2 :(得分:4)
FAR 构造可以追溯到 8086/8088 CPU 以及它使用的分段内存模式的日子。在那一天,你可以有 NEAR 和 FAR 指向内存的指针。
LP (长指针)只是早期 Microsoft Hungarian Notation 的遗留问题。
现在Win32内存模型是平的,因此 NEAR 和 FAR 指针基本相同。但是,当 near pointer 现在与 far poitner 相同时,并不意味着指针与句柄相同。
答案 3 :(得分:3)
只是为了给你一些背景长指针,也称为远指针与16位窗口中的普通16位指针不同。操作系统使用分段内存模型,您可以从一个段偏移或具有一个段+偏移量,这是一个长指针。匈牙利符号LP被用于这些长指针,并且由于这些遗留原因,在整个windows api中仍然散落着。
当然,在32位和64位Windows操作系统中,使用了平面内存模型,这些操作系统中的指针之间没有区别(尽管PAE添加了一些概念相似的东西)。