windows - renamer - software tag music
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR ¿Cuándo, cómo y por qué? (2)
Chris Becke es bastante correcto. Vale la pena señalar que estos tipos _PTR son solo tipos que tienen 32 bits de ancho en una aplicación de 32 bits y 64 bits de ancho en una aplicación de 64 bits. Es tan simple como eso.
Podría usar fácilmente __int3264 en lugar de INT_PTR, por ejemplo.
Descubrí que Windows tiene algunos nuevos tipos de datos de Windows
DWORD_PTR, INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR
¿Me puede decir cuándo, cómo y por qué usarlos?
Los tipos *_PTR
se agregaron a la API de Windows para admitir el direccionamiento de 64 bits de Win64.
Debido a que las API de 32 bits típicamente pasaban punteros usando tipos de datos como DWORD
, era necesario crear nuevos tipos de compatibilidad de 64 bits que pudieran sustituir a DWORD
en aplicaciones de 32 bits, pero se extendieron a 64 bits cuando se usaban en aplicaciones de 64 bits.
Entonces, por ejemplo, los desarrolladores de aplicaciones que quieren escribir código que funciona como 32 bits O 64 bits, la API de 32 bits de Windows SetWindowLong(HWND,int,LONG)
se cambió a SetWindowLongPtr(HWND,int,LONG_PTR)
En una compilación de 32 bits, SetWindowLongPtr
es simplemente una macro que se resuelve en SetWindowLong
, y LONG_PTR
es también una macro que se resuelve en LONG
. En una versión de 64 bits, por otro lado, SetWindowLongPtr
es una API que acepta una longitud de 64 bits como su tercer parámetro, y ULONG_PTR
es typedef para unsigned __int64
.
Al usar estos tipos de _PTR
, una base de código puede compilar para objetivos Win32 y Win64.
Al realizar la aritmética del puntero, estos tipos también deben usarse en códigos de 32 bits que deben ser compatibles con 64 bits.
entonces, si necesita acceder a una matriz con más de 4 billones de elementos, necesitará usar un INT_PTR en lugar de un 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.