Aplicaciones ANSI / Unicode


Los proyectos visuales de Easy Code pueden generar aplicaciones ANSI o Unicode de una manera muy fácil. Para pasar del modo ANSI a Unicode, sólo tiene que marcar/desmarcar la opción Este proyecto se ejecutará en modo Unicode (Windows NT o posterior) en las Propiedades del proyecto. Cuando esta opción está marcada, la aplicación generada será Unicode, contrariamente será ANSI (predeterminado).

Para mantener la compatibilidad con todas las plataformas Windows, las aplicaciones Unicode de 32 bits serán conmutadas automáticamente a ANSI cuando se ejecuten en Windows 95/98/ME. Por otra parte, las aplicaciones que no se generen como Unicode (es decir, que tengan la opción Este proyecto se ejecutará en modo Unicode desmarcada) serán siempre ANSI aunque se ejecuten en Windows NT o sistemas posteriores. Para saber en que modo se está ejecutando su aplicación, llame al método IsAppUnicode, que devuelve TRUE o FALSE dependiendo de si la aplicación se está ejecutando como Unicode o no. De esta forma, puede preparar una aplicación para que funcione correctamente en todas las versiones de Windows. Para ello, sólo debe llamar a las funciones y mensajes apropiados cuando estén relacionados con texto, y pasar las cadenas de texto en el formato correcto.

Easy Code también define la constante APP_UNICODE SOLAMENTE si la aplicación se genera en modo Unicode. Esta constante se define en tiempo de compilación y también está disponible para los proyectos visuales. Sin embargo, si la aplicación se está ejecutando en Windows 95/98/ME, se estará ejecutando en modo ANSI aunque la constante APP_UNICODE esté definida.

Se dispone de algunas macros para trabajar con texto ANSI/Unicode. TextStrA siempre devuelve una cadena de texto ANSI, TextStrW siempre devuelve una cadena de texto Unicode, y TextStr devuelve una cadena de texto ANSI o Unicode dependiendo de si la opción Este proyecto se ejecutará en modo Unicode está marcada o no. Además, todos los métodos de Easy Code que trabajan con cadenas de texto tienen sus correspondientes versiones ANSI y Unicode. Por ejemplo, el método SetText se complementa con SetTextA y SetTextW. El método SetText llama automáticamente a la versión ANSI o Unicode dependiendo de la plataforma de Windows en la que se está ejecutando y de si la aplicación ha sido generada como Unicode o no, mientras que SetTextA y SetTextW siempre llaman, respectivamente, a la versión ANSI y Unicode del método (vea Métodos de Easy Code). De esta manera puede mezclar texto ANSI y Unicode en una misma aplicación. A continuación se muestra algún código de ejemplo (donde hWnd es el "handle" del objeto al que se desea asignar el texto):

IFDEF APP_UNICODE
    Mov Eax/Rax, TextStrW("Hello") ;Modo Unicode
ELSE
    Mov Eax/Rax, TextStrA("Hello") ;Modo ANSI
ENDIF
Invoke SetText, hWnd, Eax/Rax


También puede utilizar cadenas ANSI aunque sean aplicaciones Unicode:

Invoke SetTextA, hWnd, TextStrA("Hola")


Si utiliza funciones de la API, sólo debe llamar a la función apropiada y pasar las cadenas de texto en el formato correcto:

Invoke IsAppUnicode
.If Eax/Rax
    Invoke SetWindowTextW, hWnd, TextStrW("Hola") ;Modo Unicode
.Else
    Invoke SetWindowTextA, hWnd, TextStrA("Hola") ;Modo ANSI
.EndIf


Usando la macro TextStr (o TextStr) puede simplificar todavía mas las cosas. El siguiente código funcionará bien, tanto en modo ANSI como en modo Unicode:

Invoke SetText, hWnd, TextStr("Hello")


Para los proyectos GoAsm tal vez desee usar el tipo DSS (definido por Easy Code), que hace que una cadena sea ANSI, en proyectos ANSI, o que sea Unicode en proyectos Unicode.

szHola DSS 'Hola', 0


Easy Code también define la constante CHARSIZE, que tiene el valor 1 o 2 dependiendo de si se está trabjando en modo ANSI o Unicode. Por consiguiente, si necesita incrementar en un carácter un puntero a una cadena de texto, puede utilizar la constante CHARSIZE de la siguiente manera:

Mov Esi, [lpszString]
Add Esi, CHARSIZE

OBSERVACIONES: Todas las línias anteriores han sido escritas con la sintaxis de MASM. Por favor téngalo en cuenta cuando trabaje con otros ensambladores para hecer los cambios de sintaxis necesarios.



Si está utilizando MASM32 v11 para los proyectos JWASM / MASM / POASM de 32 bits (recomendado), puede aprovechar su nueva constante __UNICODE__, que hace que el compilador haga referencia a las versiones Unicode o ANSI de la funciones de la API dependiendo, respectivamente, de si __UNICODE__ está definida o no. Easy Code y la opción Modo Unicode de Masm32 en las Propiedades del proyecto, se cuidan internamente de la constante __UNICODE__. Marcar esta opción harà que __UNICODE__ sea definida y que se llame a las versiones Unicode. Por el contrario, si la opción Modo Unicode de Masm32 no está marcada, __UNICODE__ no se definirá y se llamarà a las versiones ANSI. Por ejemplo, una llamada a SetWindowText se traducirá en una llamada a SetWindowTextA (si la opción Modo Unicode de Masm32 está desmarcada) o a SetWindowTextW (si la opción Modo Unicode de Masm32 está marcada).

NOTA: La opción Modo Unicode de Masm32 solamente tiene efecto si se usan los archivos include del MASM32 SDK (por defecto, los proyectos JWASM, MASM y POASM de 32 bits).



Tenga presente que todos los métodos de Easy Code que trabajan con cadenas de texto, esperan y retornan cadenas Unicode si la aplicación ha sido generada como Unicode y se está ejecutando en Windows NT o posterior (a menos que especifique su versión ANSI "A" o Unicode "W"). De no ser así, esperarán y retornarán cadenas ANSI. Por ejemplo, el método GetText puede devolver una cadena ANSI o Unicode dependiendo de dónde y cómo se está ejecutando la aplicación, por consiguiente, utilice el método IsAppUnicode para saber siempre el formato correcto de las cadenas de texto. Si desea llamar a un método ANSI en una aplicación Unicode, o a un método Unicode en una aplicación ANSI, llame a su versión específica. Por ejemplo, GetTextA siempre devuelve una cadena ANSI, mientras que GetTextW siempre devuelve una cadena Unicode.

Recuerde también que solamente las aplicaciones generadas con la opción Este proyecto se ejecutará en modo Unicode marcada, en las Propiedades del proyecto, serán Unicode si se están ejecutando en Windows NT o posterior. Por otra parte, las aplicaciones generadas con la opción Este proyecto se ejecutará en modo Unicode desmarcada serán siempre ANSI.