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

时间:2009-08-13 12:46:42

标签: windows winapi mfc

我发现Windows有一些新的Windows Data Types

DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR

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

2 个答案:

答案 0 :(得分:27)

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

由于32位API通常使用DWORD等数据类型传递指针,因此有必要创建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是一个API,它接受64位长作为其第3个参数,ULONG_PTRunsigned __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.

答案 1 :(得分:6)

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

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