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


Anmelden zum Antworten