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

我发现Windows有一些新的Windows数据types

DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR 

你能告诉我什么时候,如何和为什么使用它们?

*_PTR类型被添加到Windows API以支持Win64的64位寻址。

由于32位API用于存储使用DWORDS等数据类型的指针,因此有必要创建64位兼容性的新类型,在32位中用作DWORD ,但在64位应用程序中使用时扩展为64位。

因此,例如,希望编写32位或64位Windows 32位API SetWindowLong(HWND,int,LONG)应用程序开发人员被更改为SetWindowLongPtr(HWND,int,LONG_PTR)`

在32位版本中, SetWindowLongPtr只是一个解析为SetWindowLong的宏,而LONG_PTR同样也是一个解析为LONG的宏。 另一方面,在64位构建中, SetWindowLongPtr是接受64位长的API作为其第三参数,而ULONG_PTR是对于unsigned __int64 typedef。

通过使用这些_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. 

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

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