3

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

typedef HANDLE FAR          *LPHANDLE;

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

4

4 回答 4

7

“LP”代表长指针。

HANDLE != LPHANDLE,就像 DWORD != DWORD*(或 LPDWORD)

于 2008-12-24T15:23:17.537 回答
6

LP 代表长指针。在这种情况下,它是指向句柄的指针。

HANDLE h = <winapi function>();
LPHANDLE ph = &h;

您可以通过取消引用指针以与处理句柄相同的方式使用它:

HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
于 2008-12-24T15:30:24.607 回答
4

FAR构造可以追溯到8086/8088 CPU和它使用的分段内存模式的时代。在那些日子里,你可以有NEARFAR指向内存的指针。

LP(长指针)只是早期Microsoft Hungarian Notation的遗留物。

如今,Win32 内存模型是扁平的,因此NEARFAR指针基本相同。但是,虽然近指针现在与指针相同,但这并不意味着指针与句柄相同。

于 2009-01-08T00:31:19.533 回答
3

只是为了给你一些背景知识,长指针也称为远指针,与 16 位窗口中的普通 16 位指针不同。操作系统使用分段内存模型,您可以在其中从一个段偏移或有一个段 + 偏移量,这是一个长指针。匈牙利符号 LP 用于这些长指针,并且由于这些遗留原因仍然散布在整个 windows api 中。

当然,在 32 位和 64 位 Windows 操作系统中使用的是平面内存模型,并且这些操作系统中的指针之间没有区别(尽管 PAE 在概念上添加了一些类似的东西)。

于 2008-12-24T15:50:44.987 回答