Nullchar



  • Hallo,
    um den Text eines Tabs eines TabControls als String zu bekommen, verwende ich folgenden Code:

    TCITEM tciTab;
    
    	if (SendMessage(hControl, TCM_GETITEM, (WPARAM)Index, (LPARAM)&tciTab) == TRUE) {
    		MessageBox(NULL, tciTab.pszText, NULL, NULL);
    		tstring sTemp = tciTab.pszText;
    		return sTemp;
    	} else
    		return TEXT("");
    

    Rückgabe soll ein tstring sein; d.h. bei mir std::wstring.
    Aber nachdem die MessageBox korrekt den Text ausgegeben hat, kommt der Fehler

    Unhandled exception at 0x102307ed (msvcr80d.dll) in App.exe: 0xC0000005: Access violation reading location 0xcccccccc.

    Dabei meint der Debugger, dass der Fehler in der Prozedur wcslen auftritt..
    Ich vermute, dass liegt daran, dass pszText kein Nullchar als Abschluss hat..
    Aber wieso funktioniert dann die MessageBox??

    MfG,
    Max



  • Oh Mist!!
    habe vergessen, das der Pointer tciTab.pszText ja auf noch gar nichts zeigt... 😡

    So funktionierts:

    TCITEM  tciTab;
    	tstring sTemp;
    
    	tciTab.mask       = TCIF_TEXT;
    	tciTab.cchTextMax = 150;
    	tciTab.pszText    = new TCHAR[150];
    
    	if (SendMessage(hControl, TCM_GETITEM, (WPARAM)Index, (LPARAM)&tciTab) == TRUE)
    		sTemp = tciTab.pszText;
    	else
    		sTemp = TEXT("");
    
    	delete [] tciTab.pszText;
    	return sTemp;
    

  • Mod

    Du musst nicht new verwenden. Verwende doch einfach einen char[] der Größe auf dem Stack und weiße dies dem Zeiger zu.



  • Hallo,
    wie würde das dann aussehen?


  • Mod

    TCITEM  tciTab; 
        tstring sTemp; 
    
        tciTab.mask       = TCIF_TEXT; 
        tciTab.cchTextMax = 150; 
        TCHAR szBuffer[150];
        tciTab.pszText    = szBuffer; 
    
        if (SendMessage(hControl, TCM_GETITEM, (WPARAM)Index, (LPARAM)&tciTab) == TRUE) 
            sTemp = tciTab.pszText; 
        else 
            sTemp = TEXT("");
    


  • Achja, genau! 😃
    Danke!


Anmelden zum Antworten