2012-02-07 17 views
10

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?

+7

Tu cometiendo el error más común que causa incompatibilidades x64. – SLaks

+5

Claro, son valores enteros. Pero nadie dijo que tenían que ser 32 bits ... – Mehrdad

Respuesta

18

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.

10

Los mangos son valores de puntero.

Tienen 8 bytes de ancho en plataformas de 64 bits.

+1

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

+1

Buena idea; robado – SLaks

2

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.

4

El tamaño de un controlador depende de la arquitectura de la máquina (32/64 bits). IntPtr se encargará de eso.