Aplicaciones ANSI / Unicode (todos los proyectos)


Easy Code puede generar aplicaciones en versión ANSI o Unicode, para aprovechar plenamente todo el soporte de Unicode que ofrecen GoAsm, GoLink y GoRC.

Para conmutar entre los modos ANSI y Unicode, marque o desmarque la opción Utilizar cadenas de texto Unicode en las Propiedades del proyecto. Cuando esta opción está marcada, la aplicación será Unicode, de lo contrario será ANSI (predetminado). Para aquellas funciones de la API que tienen versiones ANSI y Unicode (por ejemplo LoadString o SetWindowText), Easy Code se asegura de que el compilador llame a la función apropiada. Por ejemplo, si llama a la función LoadString, Easy Code le dirá al compilador que llame a LoadStringA o LoadStringW dependiendo de si está selecionada la versión ANSI o Unicode, Por lo tanto, no hace falta preocuparse de ello (siempre puede evitar este funcionamento llamando directamente a la versión "A" o "W" de la función). Además, cuando trabaje con proyectos visuales, todas las cadenas generadas por el IDE (por ejemplo las propiedades que contienen texto, como Name, FontName, Text o cualquier otra cadena como App.CommandLine, App.FileName, App.Header y App.Path) se pasarán al ensamblador en el formato correcto.

La única cosa que debe tener presente cuando defina cadenas para su aplicación, es elegir el formato correcto, ANSI o Unicode, para que la aplicación generada funcione correctamente. Puede utilizar las macros L y A de GoAsm (vea el manual del compilador GoAsm).

.Data

#Define IDS_HELLO_W    L"Hola" ; Cadena Unicode explícita
#Define IDS_HELLO_A    A"Hola" ; Cadena ANSI explícita


Como se ha dicho antes, Easy Code se cuida de todas las cadenas de texto de las propiedades (proyectos visuales) y se asegura de que el compilador llame a las funciones apropiadas de la API (todos los proyectos). Lo mismo es aplicable a las cadenas declaradas en la Tabla de Cadenas del Editor de Recursos para todos los tipos de proyecto. Las cadenas de los recursos son almacenadas siempre en formato Unicode y, si es preciso, se convierten a ANSI cuando se cargan del archivo ejecutable. Sólo debe ir con cuidado con las cadenas definidas como raw data (vea el manual del compilador de recursos GoRC).

Para que sea más fácil generar cadenas de texto que sean válidas tanto para ANSI como para Unicode, Easy Code define la macro TEXT y el tipo DSS. Cuando se selecciona la versión ANSI (opción Utilizar cadenas de texto Unicode desmarcada), TEXT devuelve una cadena ANSI y DSS se define como DB (byte). Por el contrario, si se selecciona la versión Unicode (opción Utilizar cadenas de texto Unicode marcada), la cadena devuelta por TEXT será Unicode y DSS será definida como DW (word).

.Data

IDS_QUIT       DSS  TEXT("¿Seguro que desea salir?")
IDS_LF         DSS  13, 10
IDS_NULL       DSS  0


Easy Code también define la constante CHARSIZE, que tiene el valor 1 o 2 dependiendo de si se utiliza la versión ANSI o Unicode. Por lo tanto, si necesita incrementar un puntero de cadena en un carácter, puede utilizar la constante CHARSIZE de la manera siguiente:

Mov Esi, [lpszString]
Add Esi, CHARSIZE

Dependiendo del modo en el que esté trabajando (ANSI o Unicode), el registro Esi se incrementará en 1 o 2 bytes. Además, siempre podrá saber si está trabajando en modo ANSI o Unicode utilizando la directiva #IFDEF UNICODE de la siguiente manera:

#IFDEF UNICODE
    ;Modo Unicode
#ELSE
    ;Modo ANSI
#ENDIF


Aplicaciones ANSI / Unicode

Teniendo en cuenta algunas consideraciones, podrá generar un proyecto en formato ANSI o Unicode sin tener que modificar ni una sola letra del código fuente (sólo marcando o desmarcando la opción Utilizar cadenas de texto Unicode). Todos los ejemplos incluidos en esta versión de Easy Code están programados de esta manera (excepto el ejemplo CardFile, que sólo es ANSI).

1 - Definir todas las cadenas de texto en la Tabla de Cadenas del Editor de Recursos funcionará bién tanto en ANSI como en Unicode y será mas fácil traducir la aplicación a otros idiomas.

2 - Para otras cadenas de texto y caracteres de control definidos en el código fuente (secciones .Code y .Data), utilice siempre la macro TEXT y el tipo definido DSS:

.Data

IDS_STRING1    DSS       TEXT("Cadena1")
IDS_STRING2    DSS       TEXT("Cadena2")
IDS_LF         DSS       13, 10
IDS_NULL       DSS       0
IDS_BUFFER     DSS       MAX_PATH Dup ?

.Code

Invoke LookupPrivilegeValue, NULL, TEXT("SeShutdownPrivilege"), Addr tpr.Privileges.Luid
 

Puesto que MAX_PATH tiene un valor de 260, IDS_BUFFER será de 260 bytes en ANSI y de 520 bytes (260 palabras) en Unicode.

3 - Cuando llame a funciones de la API, no llame nunca directamente a su versión ANSI o Unicode, p.e. LoadStringA o LoadStringW. Utiliceu siempre su nombre genérico, p.e. LoadString, y deje que Easy Code y GoAsm se cuiden de ello.

4 - Cuando incremente caracteres en punteros de cadena, utilice siempre la constante CHARSIZE para asegurarse de que está incrementando 1 byte para ANSI o 2 bytes para Unicode. Por otra parte, recuerde utilizar la directiva #IFDEF UNICODE cuando necesite saber si la aplicación es ANSI o Unicode.


OBSERVACIONES:
Para mas información sobre Unicode, vea el manual del compilador GoAsm.

 

La opción /mslu del enlazador GoLink

La opción /mslu hace que GoLink añada el código de carga del "Microsoft Layer for Unicode" ("mslu") en el archivo generado, para que las aplicaciones Unicode puedan funcionar en Windows 95, 98 o ME. Para los proyectos clásicos puede añadir la opción /mslu en el cuadro de texto de las Opciones del enlazador GoLink en las Propiedades del proyecto. Para los proyectos visuales esta opción es añadida internamente SÓLO si el archivo unicows.dll de Microsoft está en la misma carpeta donde se encuentra el enlazador GoLink (GoAsm\Bin) o en el directorio del sistema, ya que el enlazador necesita que este archivo esté en una de las dos carpetas mencionadas cuando utiliza la opción /mslu. Si no tiene el archivo unicows.dll (aunque es muy fácil conseguirlo en la web de Microsoft), no utilice la opción /mslu.


OBSERVACIONES:
Para mas información sobre "mslu", vea el manual del enlazador GoLink.

AVISO: Recuerde que cuando Easy Code se ejecuta en modo Unicode (es decir, en Windows NT o sistemas posteriores) 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 esta cuestión a la hora de seleccionar carpetas o dar nombre a los objetos y archivos de sus proyectos.