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 Typumwandlung

    Was 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 Violation

    und 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.html

    Vielleicht 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.


Anmelden zum Antworten