remarks cref c# winapi pointers intptr

cref - remarks c#



¿Qué significa LRESULT, WPARAM y LPARAM? (4)

Ese es un ejemplo para la notación húngara:

  • L en ambos LPARAM y LRESULT significa "largo", designando un int 32 bits
  • w en WPARAM significa "palabra" (que solía ser int 16 bits pero ahora también es una int 32 bits, al menos cuando se dirige a una arquitectura de 32 bits)

El resto de los nombres / alias de tipo se supone que insinúa su significado, es decir, LRESULT contiene algún tipo de valor de resultado, LPARAM y WPARAM se utilizan para variables de parámetro.

El significado real del contenido de los parámetros de wParam y lParam depende del mensaje particular que se envía; solo son cubos genéricos para los parámetros del mensaje. Por lo tanto, es bastante probable que no pueda eludir los moldes de tipo inseguro.

Estoy importando funciones de WinApi, escribiendo devoluciones de llamadas, etc. ( ejemplo ) en C # y siempre me pregunto:

  • qué quieren decir ? LRESULT como último resultado ? W-PARAM? L-PARAM?
  • cómo "envolverlos" de forma segura
    • WPARAM y LPARAM contienen estructuras a veces. Entonces necesito usarlos como IntPtr . ¿Qué tal LRESULT ? ¿Estoy seguro con int o mejor IntPtr ?

¿Qué tipo de uso utilizo para LRESULT en C #? int o IntPtr ?


Los nombres provienen de razones históricas. En la era de WIndows16 bit, WPARAM significaba Parámetro de palabra y Parámetro largo de LPARAM en una clasificación de notación húngara. moviéndose a 32 bits colapsó ambos al mismo tamaño (enteros de 32 bits) pero no cambiaron los nombres. LRESULT significó un resultado prolongado y, de nuevo, el nombre se conserva por razones históricas. Otro cambio ocurre cuando salió el bit de Windows64. Mire aquí en MSDN para tener una lista completa. En detalles: tanto LPARAM como LRESULT son un typedef para LONG_PTR , donde LONG_PTR es:

#if defined(_WIN64) typedef __int64 LONG_PTR; #else typedef long LONG_PTR; #endif

WPARAM es un typedef para UINT_PTR , donde UINT_PTR es:

#if defined(_WIN64) typedef unsigned __int64 UINT_PTR; #else typedef unsigned int UINT_PTR; #endif

Puede ver básicamente los tipos que finalmente apuntan a los mismos bits de tamaño: la única diferencia real es si está usando Windows 32 o 64. En términos de significado de uso , son parámetros de propósito general que puede usar dependiendo de lo que necesite el procedimiento de ventana hacer. Normalmente, dado que un par de números no es suficiente, se usan poiter para estructuras de datos complejas y sus valores pasan como WPARAM o LPARAM, por lo que no puede asignar ningún significado particular a menos que focalice un contexto.


Ese es Charles Simonyi, el ex jefe del grupo de software de aplicaciones en Microsoft, el grupo que desarrolló Word y Excel. Él es el que establece los estándares de nomenclatura de identificadores. Como nadie sabe cómo pronunciar su apellido, eligieron el país en el que nació y lo llamaron notación húngara. El grupo de Windows lo adoptó también, pero escogió el tipo "malo", System Hungarian. Donde la primera letra (s) del identificador se elige para observar el tipo de la variable. A diferencia del tipo "bueno", Apps húngaro, que selecciona el prefijo por el nombre del tipo lógico en lugar del nombre del tipo físico. La versión de Simonyi.

Entonces es L como en Long, W como en Word. LPCWSTR es un dozy como ese, Long Pointer to Constant Wide String. Un problema claro con System Hungarian es que ya no funciona tan bien cuando cambia la arquitectura. Originalmente elegido para sistemas operativos de 16 bits (L = 32 bits, W = 16 bits), migrado a 32 bits sin cambiar el nombre (W = 32 bits), hoy estamos en 64 bits (L = W = 64 bits).

Así que ignora estos prefijos, solo son un accidente histórico. Realmente debe elegir IntPtr para el tipo LRESULT, ciertamente puede ser un valor de 64 bits en la versión de 64 bits de Windows. Los problemas muy difíciles de diagnosticar ocurren cuando no, una pregunta común aquí.

Fuera del tema, la imagen borrosa que ves en el fondo de la fotografía es un interesante extracto de Simonyi también. Microsoft compartió su gran éxito con sus empleados y convirtió a muchos de ellos en multimillonarios. Lo que ves en el fondo es una toma del transbordador espacial acoplado a la Estación Espacial Internacional. Simonyi es uno de los siete "turistas espaciales" y se compró un boleto para el IIS. El único que lo hizo dos veces , lo devolvió $ 60 millones :)


LPARAM es un typedef para LONG_PTR que es un largo (firmado de 32 bits) en win32 y __int64 (firmado de 64 bits) en x86_64.

WPARAM es un typedef para UINT_PTR que es unsigned int (unsigned 32-bit) en win32 y unsigned __int64 (unsigned de 64-bit) en x86_64.

typedef UINT_PTR WPARAM;

typedef LONG_PTR LPARAM;

En c # puede usar IntPtr

Ver ¿Cuáles son las definiciones para LPARAM y WPARAM?