DWORD_PTR,INT_PTR,LONG_PTR,UINT_PTR,ULONG_PTR何时,如何以及为什么?

ju.*_*ju. 18 windows winapi mfc

我发现Windows有一些新的Windows数据类型

DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
Run Code Online (Sandbox Code Playgroud)

你能告诉我何时,如何以及为何使用它们?

Chr*_*cke 28

这些*_PTR类型已添加到Windows API中,以支持Win64的64位寻址.

因为32位API通常使用类似数据类型传递指针DWORD,所以有必要创建64位兼容性的新类型,可以替代DWORD32位应用程序,但在64位应用程序中使用时扩展到64位.

因此,例如,想要编写32位或64位Windows 32位API的代码的应用程序开发人员SetWindowLong(HWND,int,LONG)已更改为SetWindowLongPtr(HWND,int,LONG_PTR)

在32位身材,SetWindowLongPtr简直是解析为一个宏SetWindowLong,并且LONG_PTR同样可以解析为一个宏LONG.另一方面,在64位构建中,SetWindowLongPtr是一个API,它接受64位长作为其第3个参数,并且ULONG_PTR是typedef unsigned __int64.

通过使用这些_PTR类型,一个代码库可以为Win32和Win64目标进行编译.


执行指针运算时,这些类型也应该用于需要与64位兼容的32位代码.

因此,如果您需要访问超过40亿个元素的数组,则需要使用INT_PTR而不是INT

  CHAR* pHuge = new CHAR[0x200000000]; // allocate 8 billion bytes
  INT idx;
  INT_PTR idx2;
  pHuge[idx]; // can only access the 1st 4 billion elements.
  pHuge[idx2]; // can access all 64bits of potential array space.
Run Code Online (Sandbox Code Playgroud)


Goz*_*Goz 7

克里斯贝克非常正确.值得注意的是,这些_PTR类型只是在32位应用程序上为32位宽,在64位应用程序上为64位宽的类型.就这么简单.

例如,您可以轻松使用__int3264而不是INT_PTR.