Typecast Problem!
-
Hallo Forum,
hab ein problem mit Typcast, das ist aus dem beispiel für Clipboard-benutzung!//strData ist CString, hat den zu kopierenden Text! strcpy(pchData, LPCSTR(strData)); /* error C2440: 'type cast' : cannot convert from 'class CString' to 'const char *' */
aus : http://www.codeproject.com/clipboard/archerclipboard1.asp
Wie soll ich den sonst den CString in ein char* speichern??
Habs dann so versucht:char * pchData; pchData = (char*)GlobalLock(hClipboardData); strcpy(pchData, (LPCSTR)(strData.GetBuffer(strData.GetLength()))); GlobalUnlock(hClipboardData); SetClipboardData(CF_TEXT,hClipboardData); CloseClipboard(); // das geht, aber es wird immer nur das erste zeichen übernommen?? // der rest des strings wird nicht mitgespeichert
Wenn ich jetzt den Text aus der zwischenablage hole, ist es immer nur 1 Zeichen??
Jemand ein Tipp für mich??
mfg
pixel
-
Kann es sein, daß du für UNICODE programmierst? In dem Fall solltest du eher die generischen Char-Funktionen und Typen verwenden ("_tstrcpy(pchData,LPTCHAR(strData));") - oder du verwendest statt char* gleich einen CString für die interne Verarbeitung.
-
*ups, nicht richtig gelesen, sorry*
-
Wo ist das GlobalAlloc?
-
@CStoll, du hast recht, es ist ein UNICODE Project!
@estartu, GlobalAlloc ist 2 zeilen weiter oben, ich habs nur nicht mit copiert:
hClipboardData = GlobalAlloc(GMEM_DDESHARE, strData.GetLength()+1);
mfg
pixel
-
pixel schrieb:
@CStoll, du hast recht, es ist ein UNICODE Project!
Und da haben wir schon das Problem - in UNICODE arbeitet CString auf wchar_t und die sind nicht kompatibel mit char (deswegen brauchst du dort TCHAR und die generischen Versionen der char*-Funktionen).
-
hi,
habs geändert, nur ist das problem jetzt bei ://SetClipboardData(CF_TEXT,hClipboardData); SetClipboardData(CF_UNICODETEXT,hClipboardData); // Fehler ist bei beiden Funktionen, egal welche ich benutze?!
mfg
pixel
-
Was für ein Fehler kommt denn da jetzt? Da ist doch gar kein char mehr im spiel...
-
hi,
das ist der gesammte code, da ist nicht viel, aber ...CString strData; strData = m_pUrlList.GetItemText(m_pUrlList.GetSelectionMark(), 0); if (OpenClipboard()) { EmptyClipboard(); HGLOBAL hClipboardData; hClipboardData = GlobalAlloc(GMEM_DDESHARE, strData.GetLength()+1); TCHAR *pchData; pchData = (TCHAR*)GlobalLock(hClipboardData); CString csStr //csStr = (CString*) GlobalLock(hClipboardData); // geht nicht LPCTSTR lpStr = (LPCTSTR) strData; // mit wcscpy() und TCHAR werden die Daten sauber copiert, nicht bei strcpy(); wcscpy(pchData, (const unsigned short*)lpStr); GlobalUnlock(hClipboardData); //SetClipboardData(CF_TEXT,hClipboardData); // der Fehler passiert an dieser Stelle: SetClipboardData(CF_UNICODETEXT,hClipboardData); // User Breackpoint called from code at 0x7c911230 // das ist die Fehermeldung??? CloseClipboard(); }
Ich weis jetzt auch nicht mehr!
mfg
pix el
-
pixel schrieb:
hClipboardData = GlobalAlloc(GMEM_DDESHARE, strData.GetLength()+1);
Dies sollte lauten:
hClipboardData = GlobalAlloc(GMEM_DDESHARE, (strData.GetLength()+1) * sizeof(TCHAR));
pixel schrieb:
wcscpy(pchData, (const unsigned short*)lpStr);
Dies sollte lauten:
_tcscpy(pchData, strData);
Und nun:
#ifdef UNICODE SetClipboardData(CF_UNICODETEXT, hClipboardData); #else SetClipboardData(CF_TEXT, hClipboardData); #endif
-
oh mei,
danke jochen, das funktionert jetzt alles!mfg
pixel