在浏览一些代码时,我发现了一个调用 打开打印机(). 。该代码可以编译并且运行良好。但是,我们正在通过一个 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 添加了概念上类似的东西)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top