Clipboard funktioniert in Debug-Version, leider nicht bei der Release-Version.
-
Hallo liebe Forumuser,
Ich habe leider ein Problem, bei dem ich einfach nicht weiterkomme. Hilfe/Suche und probieren habe ich jetzt über Stunden versucht und ich hab immernoch keine Ahnung
Es geht um den folgenden Code:
CString source = "Test"; HGLOBAL clipbuffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_DDESHARE, source.GetLength()+1); long lLen = source.GetLength () + 1; char* buffer; buffer = (char*)GlobalLock(clipbuffer); memcpy( buffer, source.GetBuffer(0), lLen ); GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT,clipbuffer); CloseClipboard(); hTraceBox->Paste();
In der DEBUG Umgebung funtkioniert er ohne Probleme, nur wenn ich das Programm als Release Version ablaufen lassen, wird immer nur der erste Buchstabe in das CEdit Element geschrieben.
Ziel des Abschnitt ist es, Text in ein CEdit zu schreiben. Vielleicht gibt es dafür ja auch noch einen anderen weg?!
Ansonsten bleibt die Frage, warum in der Release Version immer nur der erste Buchste aus dem Clipboard gespeichert wird.Ist der memcpy in der Release Version anders?
Vielen Danke für eure Hilfe,
Keks
-
ich denke das dein fehler in zeile 9 zu suchen ist.
memcpy( buffer, source.GetBuffer(0), lLen );
und zwar bei dem 2'ten parameter
source.GetBuffer(0)
mit GetBuffer(0) sagst du das du nur das erste zeichen aus source haben willst.
source.GetBuffer(lLen)
sollte klappen.
-
Vielen Dankfür deinen Tipp, nur leider hat er nicht geholfen
Der Parameter beschreibt nur die Minimalgröße. Eine Änderung hat leider nichts bewirkt und wenn das der Fehler gewesen wäre, dann müsste er doch eigentlich auch in der Debug Version auftreten oder?
-
hmm,
du kann ja mal nen normalen strcpy versuchen.
-
Habe ich auch schon versucht. Beim compilieren bekomme ich da folgenden Fehler:
strcpy(buffer, (LPCSTR)source); error C2440: 'type cast' : cannot convert from 'CString' to 'LPCSTR'
Wieder nur in der Release Version...
-
strcpy(buffer, source.GetBuffer(source.GetLenght()));
-
Erstmal noch einmal vielen Dank für deine Hilfe!
Jetzt kann ich es auch mit der Funktion strcpy testen nur leider bleibt das Ergebnis das gleicheIn der Release Version wird immer nur das erste Zeichen aus dem Clipboard angezeigt und nicht der ganze String.
Ich werd langsam verrücktGibt es vielleicht eine ganz andere Möglichkeit meine Anforderung zu erfüllen?
Ich möchte gerne Text aus dem Prgramm in ein editierbares Feld eines Dialogs ausgeben.
Lohnt ein Test mit Rich Edit 2.0 Control?Für weitere Hilfe wäre ich sehr dankbar!
-
Du willst nur Text in einem CEdit setzen ??
Dann verwende doch SendDlgItemMessage mit WM_SETTEXT:SendDlgItemMessage(IDC_EDIT, m WM_SETTEXT, 0, reinterpret_cast<LPARAM>(szText));
Ansonsten debugge doch mal dein Release. Vielleicht lässt sich da was erkennen.
-
Ich habe den Quellcode jetzt wie folgt geändert:
WPARAM length = SendDlgItemMessage( IDC_TRACE, WM_GETTEXTLENGTH, 0, 0 ); char *buffer = new char [length+source.GetLength()+1]; LRESULT got = SendDlgItemMessage( IDC_TRACE, WM_GETTEXT, length+1, (LPARAM)buffer ); long lLen = source.GetLength () + 1; //memcpy( &buffer[length], source.GetBuffer(lLen), lLen ); strcpy(&buffer[length], (LPCSTR)source.GetBuffer(source.GetLength())); SendDlgItemMessage(IDC_TRACE, WM_SETTEXT, 0, (LPARAM)buffer); delete [] buffer;
Leider bleibt die Ausgabe nicht zufriedenstellend
Debug Version:
Context established...
Smartcard Readers found:
- SCM Microsystems Inc. SCR33x USB Smart Card Reader 0
Smartcard connected...Release Version:
C몭몭몭몭몭A몭ꮫꮫꮫﺫﻮﻮﻮIch hoffe jemanden fällt eine Lösung ein.
-
So langsam kommen wir der Lösung näher.
Ich bin Unmsteiger von Visual Studio 6.0 und da konnte man noch nicht im Release Modus debuggen.
Durch den Tipp habe ich folgendes gefunden. Im Speicher des CString gibt es einen Unterschied bei
der Release zur Debug Version:Release: 0x0037FF40 43 00 6f 00 6e 00 74 00 65 00 78 00 74 00 20 00 C.o.n.t.e.x.t. . Debug: 0x0037A438 43 6f 6e 74 65 78 74 20 65 73 74 61 62 6c 69 73 Context establis
Durch die trennenden 00 können die Strings natürlich nicht verarbeitet werden.
Bleibt die Frage ob das immer so ist und wie ich einen CString auslesen ohne die 00?
Hoffentlich bleibt das jetzt die letzte Frage...
-
was hast du eigendlich für projecteinstellungen unter zeichensatz?
unicode- o. multi-byte zeichensatz
-
Genau das wars:
Configuration Properties - General - Character Set = Use Multi-Byte Character SetUnd schon gehts! Oh man, dafür habe ich so viele Stunden gebraucht
Naja, Danke für eure Hilfe. Besonders der Tipp mit dem debuggen wird mir sicher nochmal helfen.
Viele Grüße
Keks