Aplicacions ANSI / Unicode (tots els projectes)


L'Easy Code pot generar aplicacions en versió ANSI o Unicode per tal d'aprofitar plenament tot el suport d'Unicode que ofereixen el GoAsm, el GoLink i el GoRC.

Per tal de commutar entre els modes ANSI i Unicode, marqueu o desmarqueu l'opció Utilitza cadenes de text Unicode a les Propietats del projecte. Quan aquesta opció està marcada, l'aplicació serà Unicode, altrament serà ANSI (predetminat). Per aquelles funcions de l'API que tenen versions ANSI i Unicode (per exemple LoadString o SetWindowText), l'Easy Code s'assegura que el compilador cridi la funció apropiada. Per exemple, si crideu la funció LoadString, l'Easy Code li dirà al compilador que cridi LoadStringA o LoadStringW depenent de si està selecionada la versió ANSI o Unicode, Per tant, no cal preocupar-se d'això (sempre podeu evitar aquest funcionament cridant directament a la versió "A" o "W" de la funció). A més, quan treballeu amb projectes visuals, totes les cadenes generades per l'IDE (per exemple les propietats que contenen text, com ara Name, FontName, Text o qualsevol altra cadena com App.CommandLine, App.FileName, App.Header i App.Path) es passaran a l'assemblador en el format correcte.

L'única cosa que heu de tenir present quan definiu cadenes per a la vostra aplicació, és triar el format correcte, ANSI o Unicode, per tal que l'aplicació generada funcioni correctament. Podeu utilitzar les macros L i A del GoAsm (vegeu 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


Tal com s'ha dit abans, l'Easy Code se'n cuida de totes les cadenes de text de les propietats (projectes visuals) i s'assegura de que el compilador cridi les funcions apropiades de l'API (tots els projectes). El mateix és aplicable a les cadenes declarades a la Taula de Cadenes de l'Editor de Recursos per a tots els tipus de projecte. Les cadenes dels recursos són emmagatzemades sempre en format Unicode i, si cal, es converteixen a ANSI quan es carreguen del fitxer executable. Només heu d'anar en compte amb les cadenes definides com a raw data (vegeu el manual del compilador de recursos GoRC).

Per tal que sigui més fàcil generarar cadenes de text que siguin vàlides tant per ANSI com per Unicode, l'Easy Code defineix la macro TEXT i el tipus DSS. Quan se selecciona la versió ANSI (opció Utilitza cadenes de text Unicode desmarcada), TEXT torna una cadena ANSI i DSS es defineix com a DB (byte). D'altra banda, si se selecciona la versió Unicode (opció Utilitza cadenes de text Unicode marcada), la cadena tornada per TEXT serà Unicode i DSS serà definida com a DW (word).

.Data

IDS_QUIT       DSS  TEXT("Segur que voleu sortir?")
IDS_LF         DSS  13, 10
IDS_NULL       DSS  0


L'Easy Code també defineix la constant CHARSIZE, que té el valor 1 o 2 depenent de si s'utilitza la versió ANSI o Unicode. Per tant, si necessiteu incrementar un punter de cadena en un caràcter, podeu utilitzar la constant CHARSIZE de la manera següent:

Mov Esi, [lpszString]
Add Esi, CHARSIZE

Depenent del mode en el que estigueu treballant (ANSI o Unicode), el registre Esi s'incrementarà en 1 o 2 bytes. A més, sempre podreu saber si esteu treballant en mode ANSI o Unicode utilitzant la directiva #IFDEF UNICODE de la següent manera:

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


Aplicacions ANSI / Unicode

Tenint en compte algunes consideracions, podreu generar un projecte en format ANSI o Unicode sense haver de modificar ni una sola lletra del codi font (només marcant o desmarcant l'opció Utilitza cadenes de text Unicode). Tots els exemples inclosos en aquesta versió de l'Easy Code estan programats d'aquesta manera (excepte l'exemple CardFile, que només és ANSI).

1 - Definir totes les cadenes de text a la Taula de Cadenes de l'Editor de Recursos funcionarà bé tant en ANSI com en Unicode i serà més fàcil traduir l'aplicació a altres idiomes.

2 - Per altres cadenes de text i caràcters de control definits al codi font (seccions .Code i .Data), utilitzeu sempre la macro TEXT i el tipus definit 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
 

Com que MAX_PATH té un valor de 260, IDS_BUFFER serà de 260 bytes en ANSI i de 520 bytes (260 paraules) en Unicode.

3 - Quan crideu funcions de l'API, no crideu mai directament a les seva versió ANSI o Unicode, p.e. LoadStringA o LoadStringW. Utilitzeu sempre el seu nom genèric, p.e. LoadString, i deixeu que se'n cuidin l'Easy Code i el GoAsm.

4 - Quan incrementeu caràcters en punters de cadena, utilitzeu sempre la constant CHARSIZE per tal d'assegurar-vos que esteu incrementant 1 byte per ANSI o 2 bytes per Unicode. D'altra banda, recordeu utilitzar la directiva #IFDEF UNICODE quan necessiteu saber si l'aplicació és ANSI o Unicode.


OBSERVACIONS:
Per a més informació sobre l'Unicode, vegeu el manual del compilador GoAsm.

 

L'opció /mslu de l'enllaçador GoLink

L'opció /mslu fa que el GoLink afegeixi el codi de càrrega del "Microsoft Layer for Unicode" ("mslu") en el fitxer generat, per tal que les aplicacions Unicode puguin funcionar en Windows 95, 98 o ME. Per als projectes clàssics podeu afegir l'opció /mslu al quadre de text de les Opcions de l'enllaçador GoLink a les Propietats del projecte. Per als projectes visuals aquesta opció és afegida internament NOMÉS si el fitxer unicows.dll de Microsoft està a la mateixa carpeta on es troba l'enllaçador GoLink (GoAsm\Bin) o al directori del sistema, vist que l'enllaçador necessita que aquest fitxer estigui en una de les dues carpetes esmentades quan utilitza l'opció /mslu. Si no teniu el fitxer unicows.dll (tot i que és molt fàcil aconseguir-lo a la web de Microsoft), no utilitzeu l'opció /mslu.


OBSERVACIONS:
Per a més informació sobre el "mslu", vegeu el manual de l'enllaçador GoLink.

AVÍS: Recordeu que quan l'Easy Code s'executa en mode Unicode (és a dir, en Windows NT o sistemes posteriors) el quadre de diàleg per obrir i desar fitxers també és una finestra Unicode. Tot i així, un cop s'ha seleccionat un fitxer, el seu nom i la seva ruta ("path") es converteixen sempre a ANSI per motius de compatibilitat, per tant, tingueu present aquesta qüestió a l'hora de seleccionar carpetes o posar nom als objectes i fitxers dels vostres projectes.