Guybrush Threepwood Geschrieben 27. Januar 2014 Geschrieben 27. Januar 2014 Ich füge verschiedene Nodes in ein TreeView ein, manchmal wird jedoch beim Namen der letzte Buchstabe abgeschnitten, was ich mir nicht erklären kann. HTREEITEM CMyClass::AddFolder(MyComInterface::IFolder* pFolder, HTREEITEM hParent) { TV_INSERTSTRUCT tvinsert; memset(&tvinsert, 0, sizeof(tvinsert)); tvinsert.hParent = hParent; tvinsert.hInsertAfter = TVI_SORT; tvinsert.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_STATE; BSTR name = NULL; pFolder->get_Name(&name); tvinsert.item.pszText = CString(name).GetBuffer(); tvinsert.item.lParam = (LPARAM)pFolder; m_FolderList.push_back(pFolder); return TreeView_InsertItem(GetDlgItem(IDC_TREE1), &tvinsert); }[/PHP] Ursprünglich hab ich CW2A benutzt um den BSTR name in einen LPTSTR umzuwandeln, allerdings kam da in vielen Fällen Zeichensalat raus. Mit dem Umweg über den CString passiert das nicht mehr und wenn ich den Code im Debugger durchgehe steht in name und pszText das Gleiche drin mit allen Buchstaben. Im TreeView wird aber wie gesagt manchmal der letzte Buchstabe abgeschnitten :confused:
Klotzkopp Geschrieben 27. Januar 2014 Geschrieben 27. Januar 2014 Der Zeiger, den CString::GetBuffer liefert, ist nur solange gültig, wie der dazugehörige CString lebt. Wenn du TreeView_InsertItem aufrufst, ist er also schon ungültig. Den BSTR leakst du übrigens.
Guybrush Threepwood Geschrieben 27. Januar 2014 Autor Geschrieben 27. Januar 2014 Klotzkopp schrieb: Der Zeiger, den CString::GetBuffer liefert, ist nur solange gültig, wie der dazugehörige CString lebt. Wenn du TreeView_InsertItem aufrufst, ist er also schon ungültig. Den BSTR leakst du übrigens. Stimmt da fehlt noch ein SysFreeString für den BSTR. Das andere verstehe ich aber nicht. Müsste der CString nicht erst ungültig werden wenn die Funktion verlassen wird? Also nach dem return wenn der String schon ins TreeView eingefügt wurde?
Klotzkopp Geschrieben 27. Januar 2014 Geschrieben 27. Januar 2014 Deine CString-Instanz ist namenlos und temporär. Die lebt nur, bis die enthaltende Anweisung (in diesem Fall die Zuweisung an pszText) abgearbeitet ist.
Guybrush Threepwood Geschrieben 27. Januar 2014 Autor Geschrieben 27. Januar 2014 Hmm ok das erklärt das dann, hab mir eine "richtige" CString Variable angelegt und damit scheints zu funktionieren. Ich danke dir.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden