Aplicaciones ANSI / Unicode (sólo proyectos visuales)


Desde la versión 1.04.0.0001 los proyectos visuales de Easy Code Masm 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 Generar proyecto como 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 generadas con el modo visual de Easy Code Masm serán conmutades dinámicamente 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 Generar proyecto como Unicode desmarcada) serán siempre ANSI aunque se ejecuten en Windows NT o sistemas posteriores. Para que usted pueda saber cómo se está ejecutando una aplicación, Easy Code define la constante APP_UNICODE SÓLAMENTE si la aplicación se está ejecutando en modo Unicode. Si lo prefiere, también puede llamar 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 tener en cuenta el formato de las cadenas.

AVISO: Toda esta funcionalidad solamente se aplica a los proyectos visuales. Sin embargo, la constante APP_UNICODE también puede usarse en los proyectos clásicos marcando o desmarcando esta opción.

Con el fin de dar soporte a este nuevo formato, se ha incoporado la nueva macro para textos Unicode TextAddrW, y desde la versión 1.05.0.0002 se incluye la macro TextStr, que devuelve automáticamente el texto en formato ANSI o Unicode en función de si la opción Generar proyecto como Unicode (Windows NT o posterior) está marcada o no. Además, todos los métodos de Easy Code Masm que utilizan cadenas de texto han sido mejorados agregando sus correspondientes versiones ANSI y Unicode. Por ejemplo, el método SetText ha sido complementado 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 Masm). 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, TextAddrW("Hello") ;Modo Unicode
ELSE
    Mov Eax, TextAddr("Hello") ;Modo ANSI
ENDIF
Invoke SetText, hWnd, Eax


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

Invoke SetTextA, hWnd, TextAddr("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
    Invoke SetWindowTextW, hWnd, TextAddrW("Hola") ;Modo Unicode
.Else
    Invoke SetWindowTextA, hWnd, TextAddr("Hola") ;Modo ANSI
.EndIf


O también puede escribir el código anterior de la siguiente manera:

Invoke IsAppUnicode
.If Eax
    Mov Edx, TextAddrW("Hola") ;Modo Unicode
    Mov Eax, SetWindowTextW
.Else
    Mov Edx, TextAddr("Hola") ;Modo ANSI
    Mov Eax, SetWindowTextA
.EndIf
Push Edx
Push hWnd
Call Eax


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

Mov Eax, TextStr("Hello")
Invoke SetText, hWnd, Eax


También puede simplificar el código utilizando MASM32 v11. Si es así, puede aprovechar su nueva constante __UNICODE__, que hace que el compilador haga referencia a las versiones Unicode o ANSI dependiendo, respectivamente, de si __UNICODE__ está definida o no. Easy Code 1.06.0.0013 y versiones posteriores añaden la nueva opción Modo Unicode de Masm32 en las Propiedades del proyecto, que se cuida internamente de la constante __UNICODE__. Marcar esta opción harà que __UNICODE__ sea definida y que se utilicen les versiones Unicode. Por el contrario, si la opción Modo Unicode de Masm32 no está marcada, __UNICODE__ no se definirá y se utilizarán 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).

Tenga presente que todos los métodos de Easy Code Masm que utilizan 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. 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 de las cadenas de texto.

Recuerde también que sólamente las aplicaciones generadas con la opción Generar proyecto como 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 Generar proyecto como Unicode desmarcada serán siempre ANSI.


AVISO: Como se ha dicho anteriormente, todos los nombres de archivos y carpetas relacionados con los proyectos se tratan siempre como texto ANSI. Cuando Easy Code se ejecuta en modo Unicode (es decir, en Windows NT o posterior) el cuadro de diálogo para abrir y guardar archivos también es una ventana Unicode. Aun así, una vez se ha seleccionado un archivo, su nombre y su ruta ("path") se convierten siempre a ANSI por motivos de compatibilidad, por consiguiente, tenga presente esa cuestión a la hora de seleccionar carpetas o dar nombre a los objectos y archivos de sus proyectos.

OBSERVACIONES: Aunque los nombres de los proyectos, las fuentes, las ventanas y los controles son siempre nombres ANSI, los métodos que leen o escriben esos nombres (p.e. GetFontName y SetFontName) esperan y retornan cadenas Unicode si la aplicación se está ejecutando como Unicode. Por otra parte, cuando llame al método Create para crear una ventana, puede pasarle su nombre (primer parámetro) tanto con una cadena ANSI, como con una cadena Unicode.

IMPORTANTE: El editor de código SIEMPRE trabaja en modo ANSI y SIEMPRE necesita una fuente ANSI de anchura fija ("fixed-pitch") para funcionar correctamente.