tagger tag software renamer online musicbrainz magic full windows winapi mfc

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.