Normalerweise sollte in der Headerdatei (Includedatei), in der die Funktionen definiert werden, vom Präprozessor geprüft werden ob das Symbol UNICODE beim Compielieren definiert ist. Wenn ja, dann wird allen Funktionsdefinitionen die UNICODE-Variante zugewiesen. Oder wenn nicht die ANSI-Variante. (Das heißt nicht das System entscheidet welche Funktion genommen wird! sondern der Programmierer)
hier aus WinUser.h (PSDK)
Code: Alles auswählen
WINAPI
RegisterClassExA(
__in CONST WNDCLASSEXA *);
WINUSERAPI
ATOM
WINAPI
RegisterClassExW(
__in CONST WNDCLASSEXW *);
#ifdef UNICODE
#define RegisterClassEx RegisterClassExW
#else
#define RegisterClassEx RegisterClassExA
#endif // !UNICODE
Jedoch ist dieser Mechanismus in der "windows.inc" nicht integriert! Dort wird einfach immer auf die ANSI-Variante umgeleitet (damit man nicht immer das A ranhängen muss.) Der Grund warum der Mechanismus für UNICODE nicht eingebaut ist liegt wahrscheinlich daran das MASM32 keine UNICODE-Strings unterstützt! (ANSI "a" = 1Byte, UNICODE "a" = 2Byte) Mittlerweile gibt es wenigstens Macros dafür.
Code: Alles auswählen
In C/C++
ANSI: char text[] = "ANSI-String";
UNICODE: unsigned short text[] = L"UNICODE-String"; // wichtig ist das L !!!
Code: Alles auswählen
In MASM
ANSI: text DB "ANSI-String",0
UNICODE: text DW 'U','n','i','c','o','d','e','-','s','t','r','i','n','g',0
UNICODE: WSTR text,"UNICODE-String" ; hierfür wird aber ucmacros.asm benötigt!!!
So und alle ANSI-Funktionen werden unter NT auf UNICODE gemappt!!! Sonst würden ja alle alten Programme nicht mehr funktionieren
