GetWindowText UNICODE geht nicht:(



  • Hallo Leute,

    ich habe hole mir einen String aus nem "CEdit" raus mit "GetWindowText".

    CString host;
    _hostAddress->GetWindowText(host);
    

    Wenn ich das mit "MultiByte Character Set" kompiliere , dann funktioniert es, und es auch was im CString.

    Baue ich das aber mit UNICODE charackter set, kompiliert es auch wunderbar, aber es steht dann ein leerstring drin 😞

    Dann habe ich es mal so versucht:

    #define LEN 50
    			wchar_t* p = new wchar_t[LEN];//LPCWSTR 
    			::memset(p,0,sizeof(wchar_t) * LEN);
    			_hostAddress->GetWindowTextW(p, LEN-1);
    			host = CString(p);
    

    und mal so:

    const HWND text_box = _hostAddress->GetSafeHwnd();
    const int n = ::GetWindowTextLength( text_box );
     std::wstring text( n + 1, L'#' );
                if( n > 0 )
                {
    				::GetWindowText( text_box, &text[0], text.length() );
                }
                text.resize( n );
    	host = CString(text.c_str())
    

    alles aus google geshnipped.. aber es kappt nich, immer nur ein leerstring 😞

    was mache ich falsch, oder was habe ich nicht verstanden!?

    Danke



  • Alter das Problem ist kommt von wo ganz anders her, ich habe en CDialog und darin ein CEdit in ner RC file definiert.

    und in "OnInitDialog()"

    mache ich das :

    ASSERT(_hostAddress = reinterpret_cast<CEdit*>(GetDlgItem(IDC_EDIT_HOSTNAME)));
    

    und merke mir den pointer zu meinen CEdit in meine Dialog instanz.

    und in meinerm button click mache:

    void OnBnClickedStartButton()
    {
    _hostAddress = reinterpret_cast<CEdit*>(GetDlgItem(IDC_EDIT_HOSTNAME)); // <-----
     _hostAddress->setWindowTexZ(...) //
    }
    

    hier habe ich mir den pointer noch mal neu geholt, jetzt geht es auch in UNICODE.

    nun meine Frage: muss ich echt jedes mal GetDlgItem machen wenn ich was mit nem control machen möchte, kann
    ich das nicht einmal im init setzen und gut is!?



  • Ich hoffe dir ist klar, daß der ASSERT(...) nur im DEBUG-Modus einkompiliert wird!
    Du mußt es also auf zwei Zeilen aufteilen:

    _hostAddress = reinterpret_cast<CEdit*>(GetDlgItem(IDC_EDIT_HOSTNAME));
    ASSERT(_hostAddress);
    


  • @Th69 sagte in GetWindowText UNICODE geht nicht:(:

    Ich hoffe dir ist klar, daß der ASSERT(...) nur im DEBUG-Modus einkompiliert wird!

    ja war mir klar, und ja da war dann falsch. DANKE DIR .. ABER bei meinen Test war ich immer im Debug konfiguration.. deeswegen wundert es mich troztdem.

    EDIT:
    Ist das ASSERT trotzdem falsch? weil er ja im nicht Debugmode die Expression darin trotzdem ausführt ohne aber zu prüfen!?

    EDIT2: => #define DEBUGCHK(exp) ((void)0) ja ok er macht nichts.. dache er führt die exp aus im SHIP_BUILD


Log in to reply