Cuando uso PInvoke, noté que necesitamos usar IntPtr
para referirnos a los identificadores de Windows. Me pregunto por qué no solo usa int
para el mango? Mi comprensión de un manejador es que es solo un valor entero.¿Por qué usar IntPtr para manejarlo?
Respuesta
Un identificador de Windows se define como un entero del tamaño del puntero de la máquina nativa. Eso es para que puedan ser un puntero en secreto si es necesario. (Un identificador probablemente no es un puntero, pero es permitido uno si los implementadores del sistema operativo lo consideran necesario. Por lo general, no son punteros por razones de seguridad; hace que sea demasiado fácil para las personas abusar del sistema si en realidad son punteros.)
Un int en C# definido como un entero de 32 bits, que será demasiado pequeño en una máquina de 64 bits. Un IntPtr se define como un entero que puede contener un puntero del tamaño de la máquina. Es por eso que siempre usa IntPtr cuando interopera con manejadores.
Los mangos son valores de puntero.
Tienen 8 bytes de ancho en plataformas de 64 bits.
Yo diría "puntero- * tamaño *" en lugar de "puntero" (aunque supongo que en el sentido estricto de C/C++, eso no es muy preciso, dado que los manejadores son 'typedef''d como un puntero, y' size_t' no es necesariamente el tamaño de un puntero) ... pero si son índices en una tabla, es probable que se utilicen como enteros. Pero sí, punto tomado. – Mehrdad
Buena idea; robado – SLaks
Un identificador es esencialmente un puntero de nivel de sistema y un puntero no se convierte implícitamente en un int. Es un tipo en sí mismo. Es por eso que tiene IntPtr
en .NET para representar el tipo de Handle.
El tamaño de un controlador depende de la arquitectura de la máquina (32/64 bits). IntPtr
se encargará de eso.
- 1. ¿Qué es System.ServiceModel.Diagnostics.CallbackException y por qué no puedo manejarlo?
- 2. ¿Qué es intptr?
- 3. ¿Qué son las asas? IntPtr
- 4. ¿Puedo usar SafeHandle en lugar de IntPtr?
- 5. C# punteros vs IntPtr
- 6. IntPtr vs UIntPtr
- 7. IntPtr vs ref C#
- 8. ¿por qué no es posible comparar IntPtr.Zero y por defecto (IntPtr)?
- 9. ¿Por qué usar Url.Content para referenciar recursos?
- 10. ¿Por qué usar SOAP para servicios web?
- 11. Por qué usar scala.collection.immutable.Stack
- 12. ¿Por qué usar Mongrel2?
- 13. Advertencia de memoria y bloqueo: cómo manejarlo
- 14. ¿Por qué usar NSFetchedResultsController?
- 15. ¿Por qué usar java.io.Console?
- 16. ¿Por qué usar @PostConstruct?
- 17. ¿Por qué usar hex?
- 18. ¿Por qué usar document.write?
- 19. Por qué usar NSObjectController
- 20. Por qué usar (function() {....}());
- 21. ¿Por qué usar NSAutoreleasePool?
- 22. ¿Por qué usar mysqli_close()?
- 23. ¿Por qué usar Mono?
- 24. ¿Por qué usar LabVIEW?
- 25. ¿Por qué usar Eventos?
- 26. ¿Por qué usar ThreadStart?
- 27. ¿Por qué usar DialogFragment?
- 28. nueva IntPtr (0) vs. IntPtr.Zero
- 29. Cómo convertir IntPtr en byte *
- 30. C# Convertir IntPtr en int
Tu cometiendo el error más común que causa incompatibilidades x64. – SLaks
Claro, son valores enteros. Pero nadie dijo que tenían que ser 32 bits ... – Mehrdad