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