Winapi LPHANDLE vs.HANDLE

Winapi LPHANDLE vs.HANDLE,winapi,handle,Winapi,Handle,在浏览一些代码时,我发现调用了。代码编译后运行良好。但是,我们传递的是句柄,而不是LPHANDLE(如MSDN中所指定)。我发现在windef.h中存在以下声明: typedef HANDLE FAR *LPHANDLE; LP代表什么?我应该使用LPHANDLE,还是保留HANDLE?“LP”代表长指针 处理!=LPHANDLE,就像DWORD!=DWORD*(或LPDWORD)LP表示长指针。在这种情况下,它是指向句柄的指针 HANDLE h = <winapi f

在浏览一些代码时,我发现调用了。代码编译后运行良好。但是,我们传递的是
句柄
,而不是
LPHANDLE
(如MSDN中所指定)。我发现在
windef.h
中存在以下声明:

typedef HANDLE FAR          *LPHANDLE;
LP代表什么?我应该使用
LPHANDLE
,还是保留
HANDLE

“LP”代表长指针


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

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

HANDLE h = <winapi function>();
LPHANDLE ph = &h;
handleh=();
LPHANDLE ph=&h;
您可以通过取消对指针的引用,以与句柄相同的方式使用它:

HANDLE anotherh = *ph;
or
<winapi function>(*ph, ...);
HANDLE anotherh=*ph;
或
(*ph,…);

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


当然,在32位和64位windows操作系统中使用了平面内存模型,并且这些操作系统中的指针之间没有区别(尽管PAE添加了一些概念上相似的东西)。FAR结构可以追溯到8086/8088 CPU和它使用的分段内存模型的时代。在那一天,你可以有指向内存的指针

LP(长指针)只是早期微软匈牙利符号的遗留物

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