LPHANDLE和HANDLE的区别

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

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

4个回答

7
"LP"代表长指针。HANDLE != LPHANDLE,就像DWORD != DWORD* (or LPDWORD)一样。

6

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

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

你可以通过解引用指针的方式来使用它,就像使用句柄一样:
HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);

4

FAR结构最早可以追溯到8086/8088 CPU和它所使用的分段内存模型。在那个时代,您可以拥有指向内存的NEARFAR指针。

LP(长指针)只是来自于早期的Microsoft匈牙利命名法。

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


3
只是为了给您一些背景知识,长指针(也称为远指针)与16位窗口中的普通指针不同。操作系统使用分段内存模型,在其中您可以从段偏移或具有段+偏移量的长指针中进行偏移。这些长指针使用匈牙利标记LP,并且由于这些遗留原因,仍然散布在Windows API中。
当然,在32位和64位Windows操作系统中使用平面内存模型,并且在这些操作系统中无需区分指针(虽然PAE添加了类似的概念)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接