FormatMessage
-
Hola Leute
Wie bringe ich FormatMessage dazu, die fehlermeldung in englisch rauszugeben ?
un im deutschen zeigt er mit die umlaute nicht richtig an. woran kann das liegen ?cermy
Meep Meep
-
Meep Meep schrieb:
Hola Leute
Wie bringe ich FormatMessage dazu, die fehlermeldung in englisch rauszugeben ?
Aus dem MSDN
DWORD FormatMessage( DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, /* <= */ LPTSTR lpBuffer, DWORD nSize, va_list* Arguments );Bei "<="
dann, ebenfalls aus dem MSDNWORD MAKELANGID( USHORT usPrimaryLanguage, // LANG_ENGLISH USHORT usSubLanguage // SUBLANG_ENGLISH_US oder SUBLANG_ENGLISH_UK );Meep Meep schrieb:
un im deutschen zeigt er mit die umlaute nicht richtig an. woran kann das liegen ?
Was meinst Du genau mit "anzeigen"?
( Console? Debugger? MessageBox? ... )
Kompilierst Du für _UNICODE oder _MBCS ?Grüsse
Gast++
-
Wie bringe ich FormatMessage dazu, die fehlermeldung in englisch rauszugeben ?
geht nicht
-
re
ich verwende FormatMessageA und will die message in einer Konsole anzeigen lassen.
mit MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) bekomme ich keinen string zurueck.
Meep Meep
-
Dann gibt's vermutlich keine Ressource auf deinem System, wo die englischen Texte hinterlegt sind. Prüfe mal, ob FormatMessage 0 zurück gibt und GetLastError ERROR_RESOURCE_LANG_NOT_FOUND (1815).
-
groovemaster schrieb:
Dann gibt's vermutlich keine Ressource auf deinem System, wo die englischen Texte hinterlegt sind. Prüfe mal, ob FormatMessage 0 zurück gibt und GetLastError ERROR_RESOURCE_LANG_NOT_FOUND (1815).
wo kann ich mir die englischen resourcen runter hollen?
-
/* * Localss.cpp * * Gibt Fehlermeldung 6 "Das Handle ist ungültig" des Win32 API mit Deutschem Umlaut auf der * XP-Konsole aus mit _MBCS oder _UNICODE * * Zum Weiterschreiben und Testen von ::FormatMessage(...), _MBCS, _UNICODE, Konsolenausgaben * und Codepages * * * * Platform : Visual C++ 2005 Express Edition, Windows XP SP2 * Kompilation : cl /DDEBUG /D_UNICODE /DUNICODE Locales.cpp user32.lib * für UNICODE * resp. * cl /DDEBUG /D_MBCS Locales.cpp user32.lib * für MBCS * * oder einfach in ein Win32 Konsolenprojekt als Startdatei einbinden * * Aufruf : Locales.exe * * * Autor : Gast++ aus dem deutschen C++ Forum * Erstellungsdatum : 28.04.2007 * Version : 0.1 * * Copyright : Copyleft ! * -> Kopieren ist o.k., Klauen ist o.k., Löschen ist o.k., * aber meckern geht gar nicht ! * * ;-) ;-) ;-) * * Konventionen : Modfizierte ungarische Notation, 4 Spaces Einzüge, Klammerkonvention * nach Stroustrup; * Funktionen des Win32 API sind explizit auf den globalen Namespace * denotiert ( ::FormatMessage(...) ) */ #include "stdafx.h" // Zur Inklusion vorkompilierter Header #include <windows.h> // na ja ;-) #include <tchar.h> // um _UNICODE und _MBCS zu unterstützen #include <stdio.h> // tja... // std::cout << ... // ginge auch mit _MBCS // #include <iostream> // #include <mbctype.h> /* * Für #pragma warning * - gemopst aus der MSDN, Doku zu #pragma message */ #define PRAGMASTR2(x) #x #define PRAGMASTR(x) PRAGMASTR2(x) /* * Evtl. weniger effizient aber hübscher als * #defines die das Schriftbild immer so * zerhacken * * Kommt hier eh nicht auf Performance an. */ #ifdef _UNICODE const BOOL g_fUnicode = true; #else const BOOL g_fUnicode = false; #endif // ifdef _UNICODE const DWORD g_dwCode = ERROR_INVALID_HANDLE; // Klartext dazu: "Das Handle ist ungültig" int _tmain(int argc, TCHAR* argv) { LPVOID lpMsgBuf = NULL; // "Den LPVOID Pointer lpMsgBuffer auf Null setzen" // ;-) ;-) ;-) // Den konnte ich mir jetz nicht verkneifen. Also ernsthaft: // => Nimmt jeweils die aus Fehlercodes erzeugten Meldungen auf <= LPSTR lpszDst = NULL; // Ein char*; für die char/OEM-Konvertiereung. _KEIN_ TCHAR* ! DWORD dwWritten = 0; // Dummy; ich brauch nur die Adressen für einige Funktionsaufrufe DWORD dwBufSize = 0; // Für die Allokation von lpszDst DWORD dwErr = ERROR_SUCCESS; // Für Fehlerbehandlung und Rückgabvewert ::SetLastError(g_dwCode); _ftprintf(stdout,_T("Versuche ERROR_INVALID_HANDLE (0x00000006) im Klartext auszugeben...\n")); if ( ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErr=::GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL) != 0) { // Error zurücksetzen ::SetLastError(ERROR_SUCCESS); #pragma message (__FILE__ "[" PRAGMASTR(__LINE__) "]" ": Schmutziger harter cast von size_t(unsigned int) auf DWORD") #pragma message ( "Warum MS die bufsize nicht auch als size_t signiert ist nicht einzusehen") dwBufSize = (DWORD)_tcslen((LPTSTR)lpMsgBuf); if(g_fUnicode) { /* * Wenn man manuell auf CP 1252 ( iso-8859-1 ) umstellt * wird das nichts - "äöü" werden inkorrekt ausgegeben. * Leider weicht MS in der Codepage offenbar vom Standard ab. * Die CP 1252 (iso8859-1, Latin I) und CP 1201 ( UTF-16 FEFE, Little Endian ) * sollten nämlich imho bei den erten kongruent sein. * Interressant ist was das MSDN hier: * http://msdn2.microsoft.com/en-us/library/ms776463.aspx * so dazu berichtet: * =============================================================================== * "Note: Originally, Windows code page 1252, the code page commonly used for * English and other Western European languages, was based on an American National * Standards Institute (ANSI) draft. That draft eventually became ISO 8859-1, but * Windows code page 1252 was implemented before the standard became final, and is * not exactly the same as ISO 8859-1." * =============================================================================== * ("Not exactly the same" ist wirklich drollig wenns um Standards geht.) * Ob's wirklich daran liegt kann ich aber nicht beschwören. * --- * Diese "Wrapper" Funktion des Win32 API tut zumindest: */ ::WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), (const LPVOID) lpMsgBuf, (DWORD)(_tcslen((LPTSTR)lpMsgBuf)), &dwWritten, NULL); } else // _MBCS { /* * Hier scheint man die voreingestellte OEM-Cp 850 verwenden zu müssen * Hier klappte hingegen ::WriteConsole() nicht mit ähnlichem Symptomen wie oben * beschrieben. * * Deshalb die Konvertierung; die tut. */ if (NULL != (lpszDst = (LPSTR) ::LocalAlloc(LPTR, (dwBufSize+1)*sizeof(char)))) if( ::CharToOemBuff((LPCTSTR)lpMsgBuf,lpszDst, dwBufSize) ) _tprintf(_T("%s\n"),(LPCTSTR)lpszDst); // ginge auch mit _MBCS, s.o. // std::cout << (TCHAR*)lpszDst << std::endl; } } /* * NULL-Pointer stören hier nicht */ ::LocalFree(lpszDst); ::LocalFree(lpMsgBuf); if ((dwErr=::GetLastError())!=ERROR_SUCCESS) { /* * Okay Get me outta here ! * Auf Umlaute verzichten wir hier mal tunlichst... ;-) */ _ftprintf(stderr,_T("Oops! Das war's nicht ganz. Fehler %i ist wirklich aufgetreten.\n"),dwErr); _ftprintf(stderr,_T("Derzeit nicht zu behandeln\n")); _ftprintf(stderr,_T("Fehler nicht zu uebersetzen oder Console oder Speicher invalid")); _ftprintf(stderr,_T("Bitte sieh hier : http://msdn2.microsoft.com/en-us/library/ms681381.aspx\n")); _ftprintf(stderr,_T("unter der Fehlernummer selbst nach!\n")); } else { _tprintf(_T("Das scheint geklappt zu haben!\n")); } return dwErr; }
-
Gast++ schrieb:
/* * Localss.cpp * * Gibt Fehlermeldung 6 "Das Handle ist ungültig" des Win32 API mit Deutschem Umlaut auf der * XP-Konsole aus mit _MBCS oder _UNICODE * * Zum Weiterschreiben und Testen von ::FormatMessage(...), _MBCS, _UNICODE, Konsolenausgaben * und Codepages */[...]
ROFL! Der Code ist ja mal lollig
.
Sagmal kennst Du std::wcout ?!
-
Meep Meep schrieb:
re
ich verwende FormatMessageA und will die message in einer Konsole anzeigen lassen.
mit MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US) bekomme ich keinen string zurueck.
Meep Meep
Joar, wie gesagt, die Sprachen gibts dann warscheinlich nicht auf Deinem System, dann kannst Du sie auch nicht ausgeben.
-
farge schrieb:
wo kann ich mir die englischen resourcen runter hollen?
Keine Ahnung. Ich spekuliere einfach mal, dass du dafür eine englische kernel32.dll bräuchtest.
-
CodeFinder schrieb:
ROFL! Der Code ist ja mal lollig
.
Sagmal kennst Du std::wcout ?!
Ja, nur leider macht genau das die Proleme, die im Anfang des Threads auch für die MBCS Version beschrieben sind. :
Vielleicht liest Du dort erstmal nach; das klärt vieles...

std::cout << und std::wcout << verhalten sich genau so fehlerhaft wie printf und _wprintf.
Nur sollte ich wchar_t nicht einfach zu char und weiter zu OEM konvertieren.
=> Wenn sich das alles bei Dir anders verhält <=
poste bittte mal ein paar Versionensnummer zu
LIBC.LIB
Single thread static library, retail versionLIBCMT.LIB
Multithread static library, retail versionMSVCRT.LIB
Import library for MSVCRT.DLL, retail versionder kernel32.lib un der user32.lib.
Und zur Platform, natürlich.Grüsse
Gast++
-
-
CodeFinder schrieb:
Tzzz...
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39326.htmlTzzz...
Lass mich raten - Dein std::wcout funktioniert nicht.
Nettes Beispiel, aber wie machst Du das mit Fehlermeldungen die aus Bibliotheken kommen? (Wie es in diesem Thread das Thema ist.)
Die Strings mit Escape-Sequenzen umcodieren?
Das erscheint inperformant; das Re-Mapping, das ::WriteConsole(..) lediglich braucht ist nie länger als ein modifizierender Algorithmus.
(Bitte dran denken, der String von FormatMessage() müsste _zur_ _Laufzeit_ transformiert werden; nicht wie im Beipiel beim Kompilieren)Grüsse
Gast++
-
Tzzz....
Lass mich raten - Du wirst ewig auf eine Antwort warten.
-
merker schrieb:
Tzzz....
Lass mich raten - Du wirst ewig auf eine Antwort warten.Ja, aber ich geh ab und zu schwimmen während ich warte.

Grüsse
*this
-
Hoi, ne ich antworte schon noch, bin nur beim dem Wetter nicht soooo oft im Forum - verständlich oder ?

Also, kurz und gut: Du hast Recht
!
Hab das auch nochmal mit SetConsoleCP bzw SetConsoleOuputCP probiert, aber es geht wirklich nicht
.Gast++ schrieb:
Nettes Beispiel, aber wie machst Du das mit Fehlermeldungen die aus Bibliotheken kommen? (Wie es in diesem Thread das Thema ist.)
Die Strings mit Escape-Sequenzen umcodieren?
Das erscheint inperformant;Jopp, das ist wirklich inperformant
.merker schrieb:
Tzzz....
Lass mich raten - Du wirst ewig auf eine Antwort warten.Tja, falsch :p .
-
Hab dazu mal einen kleine Fix versucht und einen Thread gestartet
http://www.c-plusplus.net/forum/viewtopic-var-t-is-180282.html
CodeFinder schrieb:
Hoi, ne ich antworte schon noch, bin nur beim dem Wetter nicht soooo oft im Forum - verständlich oder ?

Schon. Das halte ich ähnlich.

Magst Du mal über den o.g. Code schauen, so richtig gefällt mir's nicht STL operatoren global zu überdecken...
@all
Grüsse && schönen ersten Mai !*this
-
Gast++ schrieb:
Magst Du mal über den o.g. Code schauen, so richtig gefällt mir's nicht STL operatoren global zu überdecken...
Hm joar, ist n bissl 'krass' ^^... ich würd dafür warscheinlich ne Adapterklasse schreiben.