No sé cómo usas
DllStructCreate en una función de gestión de mensaje, supongo que es para desempaquetar las dos palabras de
wparam.
En principio, como su nombre indica,
DllStructCreate es para crear una estructura de tipo de datos
Struct de C para pasar a una DLL. Una estructura es un conjunto ordenado de varias variables (campos) que pueden ser de diferente tipo (puedes tener un número entero sin signo, un real y un carácter, por ejemplo). Los tipos son los de C, que son mucho más cercanos a la máquina que en AutoIt, por eso son más específicos.
Aunque está pensado para pasar parámetros a DLL que usan estructuras, se pueden hacer algunos trucos con ellos. Por ejemplo en una función de mensaje como la que pones
wparam suele ser dos palabras de 16 bits empaquetadas en el mismo entero de 32 bits. Por ejemplo en el mensaje
WM_COMMAND la primera palabra (posición alta) suele ser el código del submensaje, y la segunda (la baja) el identificador del control.
Para extraerlos sí hay otra manera, de hecho yo lo hago de otra manera: con operaciones booleanas. Por ejemplo para extraer la parte baja ponemos a cero los 16bits altos y así nos quedamos con los bajos:
$iIDFrom = BitAND($wParam, 0x0000FFFF)
(yo pongo 0xFFFF pero con los ceros se ve más claro dónde hace ceros el AND binario)
Para tomar la parte alta se hace por ejemplo un desplazamiento de 16 bits (en los desplazamientos se pierden los bits, a diferencia de las rotaciones, con lo que nos deshacemos de la palabra baja y ponemos la alta en su lugar:
$iCode = BitShift($wParam, 16)
Otra forma de hacer eso es usando una
DLLStruct, yo creo que es más sencillo lo anterior, pero supongo que lo que tienes es una estructura de dos enteros de 16 bits (¿de qué tipo son? ¿
short?), al rellenar esa estructura con el entero de 32 bits (
wparam) puedes tomar cada una de sus partes con un
DllStructGetData. Realmente ese número de 32 bits no es un número directamente, sino que es la unión de dos números de 16 bits, con la estructura se especifica esa, eeeh, estructura, valga la redundancia
, y luego se extraen los campos individuales con el GetData
Espero no haber liado más la cosa...
(Si vamos a seguir discutiendo casi pasamos esto a otro hilo antes de que Jonny nos riña).