Aplicacions ANSI / Unicode (només projectes visuals)


Els projectes visuals de l'Easy Code poden generar aplicacions ANSI o Unicode d'una manera molt fàcil. Per passar del mode ANSI a l'Unicode, només heu de marcar/desmarcar l'opció Aquest projecte s'executarà en mode Unicode (Windows NT o posterior) a les Propietats del projecte. Quan aquesta opció està marcada, l'aplicació generada serà Unicode, altrament serà ANSI (predeterminat).

Per mantenir la compatibilitat amb totes les plataformes del Windows, les aplicacions Unicode de 32 bits seran commutades automàticament a ANSI quan s'executin en Windows 95/98/ME. D'altra banda, les aplicacions que no es generin com a Unicode (és a dir, que tinguin l'opció Aquest projecte s'executarà en mode Unicode desmarcada) seran sempre ANSI, tot i que s'executin en Windows NT o sistemes posteriors. Per tal de saber en quin mode s'està executant la vostra aplicació, crideu el mètode IsAppUnicode, que torna TRUE o FALSE depenent de si l'aplicació s'està executant com a Unicode o no. D'aquesta manera, podeu preparar una aplicació per tal que funcioni correctament a totes les versions del Windows. Per a fer-ho, només cal que crideu les funcions i missatges apropiats quan estiguin relacionats amb text, i que passeu les cadenes de text en el format correcte.

L'Easy Code també defineix la constant APP_UNICODE NOMÉS si l'aplicació es genera en mode Unicode. Aquesta constant es defineix en temps de compilació i també està disponible per als projectes visuals. Tantmatex, si l'aplicació s'està executant en Windows 95/98/ME, s'estarà executant en mode ANSI encara que la constant APP_UNICODE estigui definida.

Es disposa d'algunes macros per treballar amb text ANSI/Unicode. TextAddrA sempre torna una cadena de text ANSI, TextAddrW sempre torna una cadena de text Unicode, i TextStr torna una cadena de text ANSI o Unicode depenent de si l'opció Aquest projecte s'executarà en mode Unicode està marcada o no. A més, tots els mètodes de l'Easy Code que treballen amb cadenes de text tenen les seves corresponents versions ANSI i Unicode. Per exemple, el mètode SetText es complementa amb SetTextA i SetTextW. El mètode SetText crida automàticament la versió ANSI o Unicode depenent de la plataforma de Windows en la que s'està executant i de si l'aplicació ha estat generada com a Unicode o no, mentre que SetTextA i SetTextW sempre criden, respectivament, la versió ANSI i Unicode del mètode (vegeu Mètodes de l'Easy Code). D'aquesta manera podeu barrejar text ANSI i Unicode en una mateixa aplicació. Tot seguit es mostra algun codi d'exemple (on hWnd és el "handle" de l'objecte al que es vol assignar el text):

IFDEF APP_UNICODE
    Mov Eax/Rax, TextAddrW("Hello") ;Mode Unicode
ELSE
    Mov Eax/Rax, TextAddrA("Hello") ;Mode ANSI
ENDIF
Invoke SetText, hWnd, Eax/Rax


També podeu utilitzar cadenes ANSI tot i que siguin aplicacions Unicode:

Invoke SetTextA, hWnd, TextAddrA("Hola")


Si utilitzeu funcions de l'API, només cal que crideu la funció addient i passeu les cadenes de text en el format correcte:

Invoke IsAppUnicode
.If Eax/Rax
    Invoke SetWindowTextW, hWnd, TextAddrW("Hola") ;Mode Unicode
.Else
    Invoke SetWindowTextA, hWnd, TextAddrA("Hola") ;Mode ANSI
.EndIf


Utlitzant la macro TextStr (o TextAddr) podeu simplificar encara més les coses. El següent codi funcionará bé, tant en mode ANSI com en mode Unicode:

Invoke SetText, hWnd, TextStr("Hello")


L'Easy Code també defineix la constant CHARSIZE, que té el valor 1 o 2 depenent de si s'està treballant en mode ANSI o Unicode. Per tant, si necessiteu incrementar en un caràcter un punter a una cadena de text, podeu fer servir la constant CHARSIZE de la següent manera:

Mov Esi, [lpszString]
Add Esi, CHARSIZE

OBSERVACIONS: Totes les línies anteriors han estat escrites amb la sintaxi del MASM. Si us plau tingueu-ho en compte quan treballeu amb altres assembladors per tal de fer els canvis de sintaxi necessaris.



Si esteu utilitzant el MASM32 v11 per als projectes JWASM / MASM / POASM de 32 bits (recomanat), podeu aprofitar la seva nova constant __UNICODE__, que fa que el compilador faci referència a les versions Unicode o ANSI de les funcions de l'API depenent, respectivament, de si __UNICODE__ està definida o no. L'Easy Code i l'opció Mode Unicode del Masm32 a les Propietats del projecte, se'n cuiden internament de la constant __UNICODE__. Marcar aquesta opció farà que __UNICODE__ sigui definida i que es cridin les versions Unicode. Altrament, si l'opció Mode Unicode del Masm32 no està marcada, __UNICODE__ no es definirà i es cridaran les versions ANSI. Per exemple, una crida a SetWindowText es traduïrà en una crida a SetWindowTextA (si l'opció Mode Unicode del Masm32 està desmarcada) o a SetWindowTextW (si l'opció Mode Unicode del Masm32 està marcada).

NOTA: L'opció Mode Unicode del Masm32 només té efecte si s'utilitzen els fitxers include del MASM32 SDK (per defecte, el projectes JWASM, MASM i POASM de 32 bits).



Tingueu present que tots els mètodes de l'Easy Code que treballen amb cadenes de text, esperen i retornen cadenes Unicode si l'aplicació ha estat generada com a Unicode i s'està executant en Windows NT o posterior (a menys que especifiqueu la seva versió ANSI "A" o Unicode "W"). Altrament, esperaran i retornaran cadenes ANSI. Per exemple, el mètode GetText pot tornar una cadena ANSI o Unicode depenent d'on i com s'està executant l'aplicació, per tant, utilitzeu el mètode IsAppUnicode per saber sempre el format correcte de les cadenes de text. Si voleu cridar un mètode ANSI en una aplicació Unicode, o un mètode Unicode en una aplicació ANSI, crideu la seva versió específica. Per exemple, GetTextA sempre torna una cadena ANSI, mentre que GetTextW sempre torna una cadena Unicode.

Recordeu també que només les aplicacions generades amb l'opció Aquest projecte s'executarà en mode Unicode marcada, a les Propietats del projecte, seran Unicode si s'estan executant en Windows NT o posterior. D'altra banda, les aplicacions generades amb l'opció Aquest projecte s'executarà en mode Unicode desmarcada seran sempre ANSI.