/ / Número máximo de salida de caracteres de Win32 ToUnicode () / ToAscii () - windows, winapi, unicode, ascii

Número máximo de caracteres de salida de Win32 ToUnicode () / ToAscii () - windows, winapi, unicode, ascii

¿Cuál es el número máximo de caracteres que podrían salir de las funciones de Win32 ToUnicode () / ToAscii ()?

¿Seguro que hay un límite superior sensible en lo que puede generar un código de tecla virtual, un código de tecla de escaneo y el estado del teclado?

Respuestas

2 para la respuesta № 1

En mi máquina con Windows 8 USER32!ToAscii llamadas USER32!ToUnicode con un buffer interno y cchBuff puesto a 2. Porque la salida de ToAscii es un LPWORD y no un LPSTR No podemos asumir nada sobre los límites reales de ToUnicode de esta investigación pero sabemos que ToAscii es siempre va a dar salida a WORD. El valor de retorno le dice si 0, 1 o 2 bytes de este WORD contiene datos útiles.

Moviéndose a ToUnicode Y las cosas se ponen un poco más complicadas. Si devuelve 0, entonces no se escribió nada. Si devuelve 1 o -1 entonces se escribió un punto de código UCS-2. Nos quedamos con lo extraño. 2 <= return expresión. Podemos tratar de analizar la documentación de MSDN:

Se escribieron dos o más caracteres en el búfer.especificado por pwszBuff. La causa más común de esto es que un carácter de clave muerta (acento o diacrítico) almacenado en la distribución del teclado no se pudo combinar con la clave virtual especificada para formar un solo carácter. Sin embargo, el búfer puede contener más caracteres de los que especifica el valor de retorno. Cuando esto sucede, cualquier carácter adicional es inválido y debe ser ignorado.

Podría interpretar esto como "se escribieron dos o más caracteres, pero solo dos de ellos son válidos", pero el valor de retorno debe documentarse como 2 y no 2 ≤ value.

Creo que hay dos cosas en esta frase y deberíamos eliminar lo que se llama "caracteres adicionales":

Sin embargo, el búfer puede contener más caracteres de los que especifica el valor de retorno.

Esto simplemente implica que la función puede participar en su búfer más allá de lo que realmente va a devolver como válido. Esto es confirmado por:

Cuando esto sucede, cualquier carácter adicional es inválido y debe ser ignorado.

Esto nos deja con la desafortunada primera frase:

Se escribieron dos o más caracteres en el búfer especificado por pwszBuff.

No tengo ningún problema en imaginar un valor de retorno de 2, puede ser tan simple como un carácter base combinado con un diacrítico que no existe como un punto de código precompuesto.

La parte "o más" podría venir de múltiplesfuentes. Si el carácter base está codificado como un par sustituto, entonces cualquier carácter diacrítico / combinado adicional lo empujará a más de 2. Podría simplemente haber más de un carácter diacrítico / combinado en el carácter base. Incluso podría haber una marca líder LTR / RTL.

No sé si es posible terminar con todo.3 condiciones al mismo tiempo, pero jugaría seguro y especificaría un búfer de 10 o más WCHARs. Esto debería estar dentro de los límites de lo que puede producir en un teclado con "una sola pulsación de tecla".

Esta no es de ninguna manera una respuesta final, pero podría ser lo mejor que obtendrás a menos que alguien de Microsoft responda.