Unicode String Funktionen
-
Mach mir keine Angst! Wieso zwei EXEen? Jetzt versteh ich gar nichts mehr.
Eigentlich dachte ich, ich könnte mein Programm soweit kompatibel halten, dass es auf Win9x _und_ WinNT oder höher läuft. Genauer geht es eingentlich um eine DLL die Mithilfe der madCodeHook Library in alle Prozesse injiziert wird, um dann manche Funktionen zu patchen. Das ist eh schon schwierig genug, da ich nicht einmal feste Strings im Code haben und nur Kernel32.dll Funktionen aufrufen darf!yogle
-
Die Ansi-Version läuft auf allen Windows.
-
yogle schrieb:
Eigentlich dachte ich, ich könnte mein Programm soweit kompatibel halten, dass es auf Win9x _und_ WinNT oder höher läuft.
Warum machst Du Dir dann überhaupt die Mühe und verwendest die W-Funktionen, die es unter W9x nicht gibt? Wenn Du sie eh *immer* Emulierst, kannst Du auch gleich die A-Funktionen aufrufen

-
Damit ich den korrekten Unicodenamen erhalte muss ich ja entweder die Ansiversion aufrufen (W9x) und dann umwandeln, also die W-Funktion emulieren, oder sie direkt aufrufen (WNT). Eine Unterscheidung wann ich welche aufrufe will ich noch einbauen.
Aber ich kann keinen Unterschied mehr zu einem Unicode-Layer erkennen? Dieser macht doch exakt das selbe und ich kann ja auch nicht auf den Unicodenamen verzichten, da dieser unter ANSI Mist ist.
-
yogle schrieb:
Eine Unterscheidung wann ich welche aufrufe will ich noch einbauen.
Die ENtscheidung kann ja aber nur dynamisch (also mit LoadLibrary/GetProcAddress) erfolgen, wenn Du nur eine EXE haben willst...
yogle schrieb:
Aber ich kann keinen Unterschied mehr zu einem Unicode-Layer erkennen? Dieser macht doch exakt das selbe und ich kann ja auch nicht auf den Unicodenamen verzichten, da dieser unter ANSI Mist ist.
Ja. Warum nimmst Du nicht den MSLU?
-
So früh schon wieder dran? Respekt!
Wieso denn dynamisch. Wollte es so ungefähr machen:
// Pseudocode if( WinNT ) { W-Funktion } else { A-Funktion Umwandlung }da brauch ich doch nichts mit dynamischen laden der DLL machen.
Diese Unicodesache ist mir doch recht suspekt. Hab jetzt schon zig Artkiel gelesen aber das ganze ist recht umfangreich. Kann es sein, dass unter WNT intern als Stringformat UTF-16 benutzt wird und MessageBoxW nicht alle UTF-Zeichen anzeigen kann?
Habs bisher probeweiße so gemacht:
char *szcFileRead = NULL; wchar_t *szwFileRead = NULL; // Arraygröße anpassen szcFileRead = malloc( dwFileSize + 1); // Datei komplett einlesen if( !ReadFile( hFile, szcFileRead, dwFileSize, &dwBytesRead, NULL )) { MessageBox( NULL, "Fehler ReadFile", "Fehler", MB_OK ); CloseHandle( hFile ); return 0; } CloseHandle( hFile ); szwFileRead = malloc( dwFileSize + 1 ); // Umwandlung zu UTF MultiByteToWideChar( CP_UTF8, 0, szcFileRead, -1, szwFileRead, dwFileSize ); MessageBoxW( NULL, szwFileRead, L"Ausgelesen", MB_OK );Das Original:
αβγабвאבג⅓⅔⅛⅜⅝⅞Ω☼




♪♫ﻹﻺﻻﻼ
abc åäöMessageBoxW:
αβγабвבג□□⅛⅜⅝⅞Ω□□□□□□□□□ﻹﻺﻻﻼ
abc åäöIrgendwas stimmt noch nicht. Werd mich noch mal dran setzen müssen.
Gruß
yogle
-
yogle schrieb:
da brauch ich doch nichts mit dynamischen laden der DLL machen.
Dann wirst Du diese EXE aber unter Win9x nicht starten können, da der "Lader" der EXE die W-Funktionen nicht auflösen kann, da diese eben nicht vorhanden sind. Somit wird schon das Laden Deiner EXE abgebrochen.
yogle schrieb:
Kann es sein, dass unter WNT intern als Stringformat UTF-16 benutzt wird
Ja. Genauer gesagt UCS-2 was aber keine Bedeutung
yogle schrieb:
MessageBoxW nicht alle UTF-Zeichen anzeigen kann?
Woher hast Du denn das?
yogle schrieb:
Das Original:
αβγабвאבג⅓⅔⅛⅜⅝⅞Ω☼




♪♫ﻹﻺﻻﻼ
abc åäöMessageBoxW:
αβγабвבג□□⅛⅜⅝⅞Ω□□□□□□□□□ﻹﻺﻻﻼ
abc åäöHast Du auch wirklich UTF_8 eingelesen? Sind bei Dir auch alle Schriftarten installiert?
-
Jochen Kalmbach schrieb:
Dann wirst Du diese EXE aber unter Win9x nicht starten können, da der "Lader" der EXE die W-Funktionen nicht auflösen kann, da diese eben nicht vorhanden sind. Somit wird schon das Laden Deiner EXE abgebrochen.
Achso, dann natürlich schon. Ich würde ja gerne den fertigen Unicode-Layer benutzen, weiß aber nicht wie ich die Library vor allen anderen einfügen könnte.
Jochen Kalmbach schrieb:
yogle schrieb:
MessageBoxW nicht alle UTF-Zeichen anzeigen kann?
Woher hast Du denn das?
Dacht mir nur, da sie sonst mit UltraEdit, Notepad korrekt angezeigt wird. Was ja eigentlich auch bedeuten müsste das ich die benötigten Sprachen installiert habe und es ist ganz sicher eine UTF-8 Datei.
Aber der Code stimmt soweit?
yogle
-
yogle schrieb:
Aber der Code stimmt soweit?
Nein. Du übergibst einen zu kleinen Puffer für die UNICODE-Zeichen... dann wird versucht so viel wie möglich zu konvertieren und dann aber nicht NUL-terminiert... somit gibt er dann irgendwas aus, was nach dem Puffer steht...
Bzgl. MSLU: Was ist da genau Dein Problem?
http://msdn.microsoft.com/msdnmag/issues/01/10/MSLU/default.aspx
http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx
-
Sollt es so aussehen?
szwFileRead = malloc( (dwFileSize + 1) * sizeof(wchar_t) );Wenn, dann ok, ändert aber nichts.
Jochen Kalmbach schrieb:
Bzgl. MSLU: Was ist da genau Dein Problem?
Add the following to the link options for your application (note that these libraries are not separated by commas because that is how you add them to the link list):
* First, add the following: /nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib.
* Then add UnicoWS.lib. <-- Lib _vor_ allen anderen einfügen
* Finally, add the following libraries: Kernel32.lib Advapi32.lib User32.lib Gdi32.lib Shell32.lib Comdlg32.lib Version.lib Mpr.lib Rasapi32.lib Winmm.lib Winspool.lib Vfw32.lib Secur32.lib Oleacc.lib Oledlg.lib Sensapi.lib. In this step, omit any libraries listed after Kernel32.lib whose APIs are not used in your application. However, if your application uses another component, such as MFC, ATL, or CRT, be sure to include any libraries on which the component depends.
Das Problem ist ja, dass ich nicht weiß, wo ich bei Dev-Cpp die Lib vor allen anderen einfügen kann.
yogle
-
yogle schrieb:
Sollt es so aussehen?
Du solltest zuerst mal die erforderliche Größe ermitteln (sie Doku zu MultiByteToWideChar) und dann erst die Konvertierung durchführen. Auch solltest Du nicht vergessen ein NUL-Zeichen am Ende zu setzen (wenn nötig).
Ein Beispiel für den umgekrehrten Weg, siehe (ganz unten):
http://www.c-plusplus.net/forum/viewtopic-var-t-is-146786.htmlyogle schrieb:
Das Problem ist ja, dass ich nicht weiß, wo ich bei Dev-Cpp die Lib vor allen anderen einfügen kann.
Dann solltest Du das im Compiler-Forum fragen.... den ganze Thread dorthin zu verschieben macht keinen Sinn, oder?