题
在浏览一些代码时,我发现了一个调用 打开打印机(). 。该代码可以编译并且运行良好。但是,我们正在通过一个 HANDLE
代替 LPHANDLE
(如 MSDN 中指定)。我发现在 windef.h
存在以下声明:
typedef HANDLE FAR *LPHANDLE;
LP 代表什么?我应该使用 LPHANDLE
, ,或保留 HANDLE
?
解决方案
LP 代表长指针。在本例中它是指向句柄的指针。
HANDLE h = <winapi function>();
LPHANDLE ph = &h;
您可以通过取消引用指针来使用它,就像使用句柄一样:
HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
其他提示
“LP”代表长指针。
HANDLE != LPHANDLE,就像 DWORD != DWORD* (或 LPDWORD)
这 远的 构造可以追溯到 8086/8088CPU 以及它使用的分段记忆模式。那时你可以拥有 靠近 和 远的 指向内存的指针。
这 LP (长指针)只是一个宿醉 微软匈牙利表示法 从那些早期的日子开始。
如今,Win32 内存模型是扁平的,因此 靠近 和 远的 指针基本相同。但是虽然一个 近指针 现在与 a 相同 远普特纳 这并不意味着指针与句柄相同。
只是为了给您一些背景知识,长指针(也称为远指针)与 16 位窗口中的普通 16 位指针不同。操作系统使用分段内存模型,您可以从段中偏移或有一个段+偏移量,这是一个长指针。匈牙利表示法 LP 用于这些长指针,并且由于这些遗留原因仍然散布在整个 Windows API 中。
当然,在 32 位和 64 位 Windows 操作系统中,使用平面内存模型,并且这些操作系统中的指针之间没有区别(尽管 PAE 添加了概念上类似的东西)。
不隶属于 StackOverflow