cref - remarks c#
¿Qué significa LRESULT, WPARAM y LPARAM? (4)
Ese es un ejemplo para la notación húngara:
-
L
en ambosLPARAM
yLRESULT
significa "largo", designando unint
32 bits -
w
enWPARAM
significa "palabra" (que solía serint
16 bits pero ahora también es unaint
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
yLPARAM
contienen estructuras a veces. Entonces necesito usarlos comoIntPtr
. ¿Qué talLRESULT
? ¿Estoy seguro conint
o mejorIntPtr
?
-
¿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