Inhalt aus Listbox auslesen



  • Hallo,
    ich versuche numerische Werte aus einer Listbox auszulesen und mache das folgendermaßen:

    std::wstring wSmallHus;
    		int index = SendDlgItemMessage(IDC_SMALLHU,LB_GETCURSEL,0,0);
    		SendDlgItemMessage(IDC_SMALLHU,LB_GETTEXT,(WPARAM) index,reinterpret_cast<LPARAM>(wSmallHus.c_str()));
    
    		LPCWSTR msg = wSmallHus.c_str();
    		std::wstring temp = msg;
    

    Nun zu meinem Problem: Die Werte werden alle problemlos ausgelesen. Ich habe jedoch das Problem, dass in der untersten Zeile

    std::wstring temp = msg;
    

    die Zuordnung nur funktioniert, solange der Wert maximal 10 Zeichen beinhaltetn. Sobald der Numerische Wert 11 Zeichen oder mehr hat dann bleibt er in dieser Zeile hängen. Eine Fehlermeldung bekomme ich nicht, die Ausgabekonsole bleibt leer.

    Habt ihr eine Idee ?

    Danke

    EDIT:
    achja, wenn ich diesen "zwischenschritt" nicht mache, dann bekomme ich in meineem wstring zur ASCII zeichen heraus.


  • Mod

    reinterpret_cast<LPARAM>(wSmallHus.c_str()));
    

    Das darfst Du in keinem Fall machen.

    _c_str ist konstant ⚠
    std::string eignet sich in keiner Weise für die Rückgabe aus solchen API Funktionen. Im Endeffekt zerstörst Du evtl. sogar den Heap.

    Du musst dafür einen eigenen Buffer bereitstellen.

    Hier hat CString/CStringT eine nette Funktion wie GetBuffer/ReleaseBuffer, die so etwas erlaubt.



  • Hi,
    danke fuer deine Info. Ich denke, dass es wirklich an der "c_str()" funktion liegt und habe es jetzt folgendermaßen gemacht:

    char wSmallHus[128];
    		int index = SendDlgItemMessage(IDC_SMALLHU,LB_GETCURSEL,0,0L);
    		SendDlgItemMessage(IDC_SMALLHU,LB_GETTEXT,(WPARAM)index,(LPARAM)wSmallHus);
    
    		LPCWSTR lpcwstr_string = A2BSTR(wSmallHus);
    

    --> Ergebnis "4"

    Leider befindet sich in "lpcwstr_string " immer nur die erste Ziffer. Wenn ich es testweise ausführe funktioniert es einwandfrei:

    char char_string[100] = "48596332";
    
    		LPCWSTR rggerg = A2BSTR(char_string);
    

    --> Ergebnis "48596332"

    Es liegt mit Sicherheit an "(LPARAM)wSmallHus)" jedoch weiß ich nicht wie ich das handlen soll. Hast du noch einen Tip für mich?

    Vielen Dank!

    EDIT: Beim wstring hat es geklappt, nur dass ich eben maximal 10 zeichen auslesen konnte !?!


  • Mod

    ATBSTR ist sicherlich die absolut falscheste Funktion.
    Arbeite mit TCHAR.

    Ist Dein Projekt ein Unicode Projekt. dann ist das schon falsch:

    char wSmallHus[128];
    

    Ansonsten schau Dir das im Debugger an.



  • @Martin
    Hallo Martin,

    Martin Richter schrieb:

    reinterpret_cast<LPARAM>(wSmallHus.c_str()));
    

    Das darfst Du in keinem Fall machen.

    Heißt das generell, dass STL-Strings nie mit

    c_str()
    

    an Funktionen/Methoden übergeben werden dürfen oder geht es hier wirklich nur um Funktionen, die ggf. in einen wchar_t/char Array schreiben?

    Beispiel

    void Foo1(LPWSTR pszText)
    {
        AfxMessageBox(pszText);
    }
    
    void Bar(const std::wstring & text)
    {
        Foo1(text.c_str()); // Ist das erlaubt?
    }
    


  • Hi,
    danke hat geklappt. Ich mache es jetzt so:

    TCHAR wBigHus[128];
    	int index = SendDlgItemMessage(IDC_BIGHU,LB_GETCURSEL,0,0);
    	SendDlgItemMessage(IDC_BIGHU,LB_GETTEXT,(WPARAM)index,(LPARAM)wBigHus);
    

    DANKE!!


  • Mod

    Laura_M schrieb:

    Beispiel

    void Foo1(LPWSTR pszText)
    {
        AfxMessageBox(pszText);
    }
    
    void Bar(const std::wstring & text)
    {
        Foo1(text.c_str()); // Ist das erlaubt?
    }
    

    Als const darfst Du ihn übergeben.
    Aber Dein Sample kompiliert ja nicht mal! 🕶



  • Martin Richter schrieb:

    Aber Dein Sample kompiliert ja nicht mal! 🕶

    Erwischt! 🙂 Müsste void Foo(LPCWSTR) heißen.


  • Mod

    Eben und als const ist das kein Problem... 😉


Anmelden zum Antworten