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


Anmelden zum Antworten