Zwischenablage im DOS-Mode
-
Tag auch.
Ich habe ein Programm, welches bis jetzt einen String aus einer "input.txt" ausliest, diesen verarbeitet, und in einer "output.txt" geändert ausgibt. Das ist allerding sehr nervig. Jetzt hab ich mir gedacht die Zwischenablage zu nutzen, also man kopiert was in die Zwischenablage, das Programm verarbeitet es, und kopiert es dann geändert wieder in die Zwischenablage. Jetzt hab ich zwar schon verzweifelt nach einer Lösung dafür gesucht aber ich komme immer nur auf eine Lösung mit MFC. Meine Frage ist jetzt eigentlich nur, ob man "MFC" auch im normalen Konsolenmodus benutzen kann, und wenn ja, wie ich das anstelle (grob), oder ob es vielleicht eine nicht-MFC Lösung dafür gibt. Danke für Hinweise!
mfg RealTommi
-
Die Zwischenablage kannst du mit der Windows-API auslesen. Such mal im WinAPI-Forum danach, wurde sicherlich schon des Öfteren gefragt
MfG SideWinder
-
Also das mit dem "in-die-zwischenablage-schreiben" bekomm ich jetzt hin. Was aber noch nicht funktioniert ist das lesen aus der Zwischenablage.
Bis jetzt hab ich herausgefunden:#include <iostream> #include <string> #include <ctype.h> #include <windows.h> #include <conio.h> using namespace std; int main() { HGLOBAL hglb; LPTSTR lptstr; hglb = GetClipboardData(CF_TEXT); if (hglb != NULL) { lptstr = GlobalLock(hglb); GlobalUnlock(hglb); CloseClipboard(); } cout << lptstr; return 0; }
Aber für die Zeile:
lptstr = GlobalLock(hglb);gibt es den Fehler:
error C2440: '=' : 'void *' kann nicht in 'char ' konvertiert werden
Konvertierung von 'void' in Zeiger auf nicht-'void' erfordert eine explizite TypumwandlungWas mache ich da falsch?
-
hallo
den gezeigten fehler beseitigst du mit
lptstr = (LPTSTR)GlobalLock(hglb);
hm aber nur diesen.
-
Vielen vielen Dank, das funktioniert schonmal. Bloss jetzt führt er die Datei zwar aus aber wenn er die startet kommt so eine "Problembericht senden" box und das Programm terminiert.
Woran kann das denn noch liegen?
-
RealTommi schrieb:
Vielen vielen Dank, das funktioniert schonmal. Bloss jetzt führt er die Datei zwar aus aber wenn er die startet kommt so eine "Problembericht senden" box und das Programm terminiert.
Woran kann das denn noch liegen?
Am besten schmeißt du mal deinen Debugger an und findest erstmal raus in welcher Zeile der Programmabbruch zustande kommt.
-
Das kann ich leider nicht, bzw. hab das noch nie gemacht und mir fehlt das Wissen dazu
Ich versuch es mal
-
Also bei Degug -> Ausführen bekomme ich die Meldung:
Unbehandelte Ausnahme in Testprojekt.exe: 0xC0000005: Acces Violationund dann:
main_loop: 00409330 mov eax,dword ptr [ecx] <---- HIER STEHT DER PFEIL, Fehler 00409332 mov edx,7EFEFEFFh 00409337 add edx,eax 00409339 xor eax,0FFh 0040933C xor eax,edx 0040933E add ecx,4 00409341 test eax,81010100h 00409346 je main_loop (00409330) 00409348 mov eax,dword ptr [ecx-4] 0040934B test al,al 0040934D je byte_0 (00409381) 0040934F test ah,ah 00409351 je byte_1 (00409377) 00409353 test eax,0FF0000h 00409358 je byte_2 (0040936d) 0040935A test eax,0FF000000h 0040935F je byte_3 (00409363) 00409361 jmp main_loop (00409330) byte_3: 00409363 lea eax,[ecx-1] 00409366 mov ecx,dword ptr [esp+4] 0040936A sub eax,ecx 0040936C ret byte_2: 0040936D lea eax,[ecx-2] 00409370 mov ecx,dword ptr [esp+4] 00409374 sub eax,ecx 00409376 ret byte_1: 00409377 lea eax,[ecx-3] 0040937A mov ecx,dword ptr [esp+4] 0040937E sub eax,ecx 00409380 ret byte_0: 00409381 lea eax,[ecx-4] 00409384 mov ecx,dword ptr [esp+4] 00409388 sub eax,ecx 0040938A ret
Kann damit jemand was anfangen?
-
Versuch mal die Ausgabe von lpstr vor GlobalUnlock()/CloseClipboard() einzubauen. Da du dir den Inhalt ja nicht kopierst sondern nur einen Zeiger darauf vewaltest der (meiner Meinung nach) nach GlobalUnlock() nicht mehr für dich zugänglich ist -> Access Violation.
MfG SideWinder
-
Ahhhh!! Bingo, danke! Aber jetzt nochwas, das Programm funktioniert. ABER egal was in der Zwischenablage steht, er gibt mit cout nichts aus. Versteh ich da was falsch?
Vielen Dank für die Hilfe bis jetzt.
-
Ähm, hab gerade gemerkt, der if-Block wird garnicht ausgeführt. Aber wenn ich die Bedingung raus nehme, dann bricht er bei dem cout wieder ab
-
Ich hab die Idee übrigens hier her:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-31111-and-postdays-is-0-and-postorder-is-asc-and-start-is-20.htmlVielleicht kann damit ja jmd. was anfangen
-
Hmm auf den ersten Blick fällt mir auf, dass dort OpenClipboard() aufgerufen wird und bei dir nicht.
MfG SideWinder
-
Mhhh stimmt aber OpenClipboard() will ja einen Parameter haben, was übergeb ich ihm denn da? Das versteh ich gerade nicht so ganz
-
Übergib NULL, sollte ok sein. Aber CloseClipboard() nicht vergessen.
-
Danke danke danke, es funktioniert jetzt. Danke euch allen.
-
Hi,
bei mir wird bei folgendem Code immer nur eine Integeerzahl ausgegeben, obwohl einer langer Text in der Zwischenablage ist.LPTSTR lptstr; HGLOBAL hglb; if(OpenClipboard(NULL)) { hglb = GetClipboardData(CF_TEXT); if(hglb!=NULL) { lptstr = (LPTSTR)GlobalLock(hglb); cout << "clipb: " << lptstr << endl; GlobalUnlock(hglb); } CloseClipboard(); }
Was mache ich falsch?
danke im voraus
veio
-
Habe mal LPTSTR durch char* ersetzt und es geht.