LPHANDLE与HANDLE

时间:2008-12-24 15:20:42

标签: winapi handle

在浏览某些代码时,我发现了对OpenPrinter()的调用。代码编译并正常工作。但是,我们正在传递HANDLE而不是LPHANDLE(在MSDN中指定)。我发现在windef.h中存在以下声明:

typedef HANDLE FAR          *LPHANDLE;

LP代表什么?我应该使用LPHANDLE,还是保留HANDLE

4 个答案:

答案 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添加了一些概念相似的东西)。