Aplicacions ANSI / Unicode (només projectes visuals)


Des de la versió 1.04.0.0001 els projectes visuals de l'Easy Code Masm 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ó Genera el projecte com a 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 Windows, les aplicacions Unicode generades amb el mode visual de l'Easy Code Masm seran commutades dinàmicament 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ó Genera el projecte com a Unicode desmarcada) seran sempre ANSI tot i que s'executin en Windows NT o sistemes posteriors. Per tal que pogueu saber com s'està executant una aplicació, l'Easy Code defineix la constant APP_UNICODE NOMÉS si l'aplicació s'està executant en mode Unicode. Si ho preferiu, també podeu cridar 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 en el format correcte.

AVÍS: Tota aquesta funcionalitat només s'aplica als projectes visuals. Tantmateix, la constant APP_UNICODE també es pot utilitzar als projectes clàssics marcant o desmarcant aquesta opció.

Per tal de donar suport a aquest nou format, s'ha incorporat la nova macro per a textos Unicode TextAddrW, i des de la versió 1.05.0.0002 s'inclou la macro TextStr, que torna automàticament el text en format ANSI o Unicode en funció de si l'opció Genera el projecte com a Unicode (Windows NT o posterior) està marcada o no. A més, tots els mètodes de l'Easy Code Masm que utilitzen cadenes de text han estat millorats afegint-hi les seves corresponents versions ANSI i Unicode. Per exemple, el mètode SetText ha estat complementat 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 Masm). 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, TextAddrW("Hello") ;Mode Unicode
ELSE
    Mov Eax, TextAddr("Hello") ;Mode ANSI
ENDIF
Invoke SetText, hWnd, Eax


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

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


O també podeu escriure el codi anterior de la següent manera:

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


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

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


També podeu simplificar el codi utilitzant el MASM32 v11. Si és així, podeu aprofitar la seva nova constant __UNICODE__, que fa que el compilador faci referència a les versions Unicode o ANSI depenent, respectivament, de si __UNICODE__ està definida o no. L'Easy Code 1.06.0.0013 i versions posteriors afegeixen la nova opció Mode Unicode del Masm32 a les Propietats del projecte, que se'n cuida internament de la constant __UNICODE__. Marcar aquesta opció farà que __UNICODE__ sigui definida i que s'utilitzin les versions Unicode. Altrament, si l'opció Mode Unicode del Masm32 no està marcada, __UNICODE__ no es definirà i s'utilitzaran 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).

Tingueu present que tots els mètodes de l'Easy Code Masm que utilitzen 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. 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 de les cadenes de text.

Recordeu també que només les aplicacions generades amb l'opció Genera el projecte com a 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ó Genera el projecte com a Unicode desmarcada seran sempre ANSI.


AVÍS: Com s'ha dit anteriorment, tots els noms de fitxers i carpetes relacionats amb els projectes es tracten sempre com a text ANSI. Quan l'Easy Code s'executa en mode Unicode (és a dir, en Windows NT o posterior), 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.

OBSERVACIONS: Tot i que els noms dels projectes, les fonts, les finestres i els controls són sempre noms ANSI, els mètodes que llegeixin o escriuen aquests noms (p.e. GetFontName i SetFontName) esperen i retornen cadenes Unicode si l'aplicació s'està executant com a Unicode. D'altra banda, quan crideu el mètode Create per tal de crear una finestra, podeu passar-li el seu nom (primer paràmetre) tant amb una cadena ANSI, com amb una cadena Unicode.

IMPORTANT: L'editor de codi SEMPRE treballa en mode ANSI i SEMPRE necessita una font ANSI d'amplada fixa ("fixed-pitch") per tal de funcionar correctament.