Unicode Problem?



  • Hallo zusammen,

    ich habe eine Funktion:

    TCHAR *GetTextFromStringTable(int id)
    {
    	TCHAR message[500]; ZeroMemory(message, sizeof(message)/sizeof(TCHAR));
    	if(!LoadString(GetModuleHandle(NULL), id, message, sizeof(message)/sizeof(TCHAR)))
    	{
    		return TEXT("Es konnte kein Text gefunden werden!");
    	}
    	return message;
    }
    
    MessageBox(hWindow, GetTextFromStringTable(IDS_STRINGRegClassEx), TEXT("Error"), MB_OK | MB_ICONERROR);
    

    Sollte LoadString auf einen Fehler laufen, dann wird in der MsgBox der Text korrekt angezeigt. Andernfalls sehe ich nur merkwürdige Zeichen in der Box da der Text aus der StringTabelle irgendwie nicht richtig geladen wird. WOran liegt das bzw. was mache ich falsch?



  • Nachdem GetTextFromStringTable() zurückgekehrt ist (also noch bevor MessageBox() aufgerufen wird), was denkst du ist nun mit dem Speicher von message passiert?



  • Automat schrieb:

    TCHAR *GetTextFromStringTable(int id)
    {
    	TCHAR message[500]; ZeroMemory(message, sizeof(message)/sizeof(TCHAR));
    	if(!LoadString(GetModuleHandle(NULL), id, message, sizeof(message)/sizeof(TCHAR)))
    	{
    		return TEXT("Es konnte kein Text gefunden werden!");
    	}
    	return message;
    }
    

    Fangen wir damit an, dass message auf dem Stack erstellt wurde und der Speicherbereich nach Verlassen der Funktion nicht mehr zur Verfügung steht. Desweiteren gibt sizeof die Byte-Größe zurück, was bei ZeroMemory erwartet wird, nicht etwa die Anzahl an wchar_t im Falle von Unicode.

    Eine Lösung für ersteres Problem wäre, dass der Speicher von message statisch wäre, also nach Verlassen der Funktion weiter besteht.



  • Ihr habt natürlich recht. Ich habe das mit dem Stack vergessen. So gehts:

    TCHAR message[500];
    TCHAR *GetTextFromStringTable(int id)
    {
    	ZeroMemory(message, sizeof(message));
    	if(!LoadString(GetModuleHandle(NULL), id, message, sizeof(message)))
    	{
    		return TEXT("Es konnte kein Text gefunden werden!");
    	}
    	return message;
    }
    


  • TCHAR message[500];
    

    Globale Variable - dafür? 😮

    if(!LoadString(GetModuleHandle(NULL), id, message, sizeof(message)))
    

    ZeroMemory will die Anzahl in Bytes, LoadString will sie in Zeichen/Elemente. Die erhältst du vorzugsweise mit ARRAYSIZE oder _countof. sizeof(x)/sizeof(x[0]) ist natürlich auch eine Möglichkeit, aber viel mehr Tipparbeit und fehleranfälliger. Wieso verwendest du überhaupt ZeroMemory?



  • Im normalfall macht man dies in C so:

    BOOL GetTextFromStringTable(int id, LPTSTR szBuffer, size_t nMaxBufferSize)
    

    Und in C++ würde man dies so machen:

    std::wstring GetTextFromStringTable(int id);
    


  • Hey,

    also danke erstmal für die Tipps. Ich habe gestern abend nochmal das Win7 SDK durchforstet und bin eigentlich durch Zufall auf eine Funktion von MS gestoßen die ich dann mal so 1:1 übernommen habe.

    LPTSTR GetTextFromStringTable(int id)
    {
    	static TCHAR szBuffer[MAX_PATH];
    	szBuffer[0] = 0;
    	LoadString (GetModuleHandle(NULL), id, szBuffer, MAX_PATH);
    	return szBuffer;
    }
    

Anmelden zum Antworten