ANSI or UNICODE...

Wohl das A & O in der Windows-Programmierung

Moderatoren: crack, Krüsty, Marwin

Beitragvon Ignat » Freitag 8. August 2003, 00:39

Hi people!
For expample in my programm(TASM/C++) I used API-function called RegisterClassExA.
I know that this function works only in OS that has ANSI code (or I should say "charset"?) such Win98, but not in WinNT - it has only UNICODE.
So in WinNT I must use RegisterClassExW.
But I want my program to work in each OS! (Win98, WinNT,Win2000,WinXP, Win .NET :) ) What should I do?
Or Im wrong and programmer can use only RegisterClassExA in both OS?

---------------------------------------------------------------------------------------------
Rußland
If the ship don't know where to go - it has no fair wind...
Ignat
Alter Hase
 
Beiträge: 80
Registriert: Samstag 2. August 2003, 11:13

Beitragvon Marwin » Freitag 8. August 2003, 14:45

Hi Ignat,

laut Win32.hlp wird die Funktion [span style=color:blue]RegisterClassEx[/span] auch unter Windows NT unterstützt. Es wird nicht darauf hingewiesen, dass man die Wide-Version der Funktion nutzen soll.

Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon Ignat » Freitag 8. August 2003, 19:40

Hmm...
Und was ist das?:
Code: Alles auswählen
RegisterClassA PROTO :DWORD
RegisterClass equ <RegisterClassA>

RegisterClassExA PROTO :DWORD
RegisterClassEx equ <RegisterClassExA>


(user32.inc (MASM)).
Vielleicht, MASM hat nur Pseudonym für RegisterClass und ändere?..

----------------------------------------------------------------------------------------
Rußland
If the ship don't know where to go - it has no fair wind...
Ignat
Alter Hase
 
Beiträge: 80
Registriert: Samstag 2. August 2003, 11:13

Beitragvon Marwin » Freitag 8. August 2003, 21:19

Das ist nur eine Hilfe für den MASM-Programmierer. Man muss so nicht [span style=color:blue]RegisterClassExA[/span] aufrufen, sondern kann die Funktion [span style=color:blue]RegisterClassEx[/span] verwenden. In den Dokumentationen wie zum Beispiel die Win32.hlp oder das Platform SDK findest du nur die Funktion [span style=color:blue]RegisterClassEx[/span], aber nicht die "A-Version". Woher diese "A-Versionen" stammen weiß ich allerdings nicht.

Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon Ignat » Freitag 8. August 2003, 21:55

I think in WinNT it looks like:
Code: Alles auswählen
RegisterClassW PROTO :DWORD
RegisterClass equ <RegisterClassW>

RegisterClassExW PROTO :DWORD
RegisterClassEx equ <RegisterClassExW>

I think MASM has "RegisterClassEx equ [RegisterClassExA]" bacause Win98 is used more often then WinNT in "simple people"...

-------------------------------------------------------------------------------------
Rußland
If the ship don't know where to go - it has no fair wind...
Ignat
Alter Hase
 
Beiträge: 80
Registriert: Samstag 2. August 2003, 11:13

Beitragvon Marwin » Freitag 8. August 2003, 22:09

Das kann ich mir eigentlich nicht vorstellen.

Marwin
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon Ignat » Freitag 8. August 2003, 22:55

I wrote this topic because 1 year ago I saw the code Im talking about...
:( :( :(

----------------------------------------------------------------------------------------------
Rußland
If the ship don't know where to go - it has no fair wind...
Ignat
Alter Hase
 
Beiträge: 80
Registriert: Samstag 2. August 2003, 11:13

Beitragvon ---Loki--- » Sonntag 18. Dezember 2005, 19:40

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 :lol:
---Loki---
Newbie
 
Beiträge: 9
Registriert: Montag 8. August 2005, 14:44


Zurück zu Windows-API

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron