FormatMessage() speichert nur einen Buchstaben in den Puffer.
-
hallo ihr!
folgendes problem in eMbedded visual C++:
ich möchte den rückgabewert von GetLastError() mit FormatMessage() in lesbares format bringen.ich verwende dazu den code direkt aus der MSDN:
LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); // Process any inserts in lpMsgBuf. // ... // Display the string. MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); // Free the buffer. LocalFree( lpMsgBuf );
nur das ich am ende nicht eine MessageBox ausgebe sondern auf die konsole, also
printf("error was [%s]\n", (char *)lpMsgBuf);
nur anscheined steht in dem puffer (lpMsgBuf) jeweils nur der anfangsbuchstabe des jeweiligen error-strings
hat jemand eine ahnung woran das liegen könnte?
danke euch schonmal.
tschau, root
-
Hast du denn Speicher für deinen Buffer allokiert? Mit LocalAlloc in deinem Fall.
EDIT: Habe mich geirrt, das macht die Funktion selbst. Poste mal deinen Code, ich sehe da sonst keine Fehlerursache.
-
hi,
ja, so wie es in der MSDN steht allokiert die selber was sie braucht.
der komplette code sieht so aus:CErrorHandler::ShowMessage(DWORD dwErrorCode) { int iCharsStored; iCharsStored = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, 0, (LPTSTR)&(this->lpMessageBuffer), 0, NULL); if(iCharsStored > 0) { if(this->bDoErrorHandling) { printf("Error: %s [Code: %d]\n", (char *)(this->lpMessageBuffer), dwErrorCode); } } else { this->iError = GetLastError(); printf("CErrorHandler::ShowMessage() failed with code [%d]\n", this->iError); } LocalFree(lpMessageBuffer); }
wobei die klasse an sich so aussieht:
class CErrorHandler { private: int iError; // for internal error codes LPVOID lpMessageBuffer; // buffer for error messages public: bool bDoErrorHandling; // turns error handling on or off CErrorHandler(bool DoErrorHandling); // constructor ~CErrorHandler(); // destructor ShowMessage(DWORD dwErrorCode); // display plaintext message of the error code };
in iCharsStored stehen auch immer werte grösser als 1, also scheint der API aufruf geklappt zu haben...
hilft das weiter?
gruss, root