StringCompare CString-_bstr_t crasht bei NullString



  • Hallo,

    ich habe in meiner App ein komisches Verhalten und kann es mir nicht erklären.

    CString strValue=_T("");
    _bstr_t bstValue("");
    if(strValue.CompareNoCase((LPCTSTR)bstValue)==0)
    ... -> crasht falls bstValue leer ist
    if(strValue==(LPCTSTR)bstValue)
    ... -> crasht falls bstValue leer ist
    if(bstValue==(_bstr_t)strValue)
    ... -> funktioniert
    

    Ich vermute, es liegt an der Typkonvertierung vom Leerstring, sobald da was drinn ist, crasht es nicht.

    Würde mich freuen, wenn mir das jemand erklären kann!


  • Mod

    Deine casts sind ja auch alle falsch. Das muss doch knallen...



  • Tut mir leid, aber ich bin nicht so helle anscheinend. Ich schrieb ja schon, dass es wohl an den Casts liegt. Aber vielleicht kann mir das mal einer erklären. Und die Cast knallen nicht und müssen nicht knallen. die gehen sehr gut, ausser sie sind leer!!!!!


  • Mod

    Deine cast vernichten die eigentliche Information und führen zum Crash.
    Deine cast sind die Ursache und falsch! Punkt.
    C-casts sollte man meiden.

    Zu Deinem Problem. Du hast vermutlich ein MBCS Projekt.
    Ein CString ist dann ein Äquvivalent zu char*
    Ein BSTR ist aber immer ein wchar_t*!

    Klingelts jetzt.
    Du kannst also einen CString zum _bstr_t umwandeln, aber aus einem _bstr_t wird durch (LPCTSTR) in diesem Fall nur ein Zeiger auf Schrott.
    Jetzt klar?

    Meide C-casts wie die Pest!

    Beschäftige Dich mal mit mit den ATL Konvertierungen W2T...

    So wäre es richtig

    if(strValue.CompareNoCase(CW2T(bstValue))==0)
    ... 
    if(strValue==CW2T(bstValue))
    ... 
    if(bstValue==_bstr_t(strValue))
    ...
    

Anmelden zum Antworten