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内存模型是扁平的,因此近和远指针基本相同。但是,虽然近指针现在与远指针相同,但这并不意味着指针与句柄相同