Variable in Clipboard speichern



  • Hallo an die Pro´s.
    Ich würde gerne eine Variable: double timelag in die Zwischenablage kopieren damit ich sie in excel wieder einfügen kann. Habe auch schon im Internet gesucht und bin auf ein Stück Quellcode gestossen in dem das soweit schön kommentiert ist. Es funktioniert auch ...leider aber nur mit char, und auch nur mit einem festen text der in der Zeile: strcpy(pszData , "1.2345"); hier 1.2345 vorgegeben wird.
    Der versuch double in char bzw string zu wandeln mittels _fcvt war auch nicht der bringer.
    Ich bin am ende ... hoffe ihr könnt mir helfen. Füge noch den Quelltext an wie ich ihn gefunden habe zum thema clipboard.

    #include <iostream>
    #include <iomanip>
    #include "windows.h"
    
    using namespace std;
    
    void main()
    {	
    	char *pszData;				// Zeiger für den String
    
    	HGLOBAL hData;                          // Handle für einen Globalen Speicherblock
    
    	LPVOID pData;                           // Zeiger für den Globalen Speicherblock
    
    	pszData  =	(char*)malloc(6);
    	strcpy(pszData , "1.2345");             //unseren String erzeugen
    
    	OpenClipboard(NULL);                  /*die Zwischenablage öffnen. Hier            kann ein Handle einer offnen Zwischenablage
    eines anderen Fensters übergeben werden. 
    Übergeben wir NULL so wird eine Zwischenablage
     für den aktuellen Task geöffnet.*/
    
    	EmptyClipboard();                       //die Zwischenablage leeren.
    
    	hData = GlobalAlloc(GMEM_DDESHARE | GMEM_MOVEABLE,
    			strlen(pszData) + 1);          
    
    	/*Den Globalen Speicherblock allokieren. Die Flags kann man der MSDN entnehmen. Als Para. 2 erwartet die Funktion die Größe des benötigten Speicher.*/
    
    	pData  =  GlobalLock(hData);       
    
    	/*Den Zeiger auf den Globalen Speicherblock setzen und den Speicherblock für andere Progs sperren. Als Para. übergeben wir unseren Handle.*/
    
    	strcpy((LPSTR)pData, pszData);  
    	//unseren String in den Speicherblock kopieren.
    
    	GlobalUnlock(hData);           //Den Speicherblock wieder freigeben.
    
    	SetClipboardData(CF_TEXT, hData);           
    	/*Den Speicherblock in die Zwischenablage schieben. Flags aus der MSDN entnehmen.*/
    
    	CloseClipboard();            //die Zwischenablage wieder schließen.
    
    }
    

    Ich zähl auf euch 😉
    Seppi



  • Ich denke das gehört eher ins WinAPI-Forum, dort wird man dir sicherlich eher helfen können.

    (Aber jetzt nicht nochmal dort posten, sondern auf einen Mod warten der es verschiebt 🙄)



  • seppi83 schrieb:

    void main()
    

    *schauder*

    Wenn du die Rückgabewerte der aufgerufenen APIs prüfen würdest, würdest du feststellen, dass du einen falschen Parameter übergibst...

    #include <cstddef>
    #include <cstring>
    #include <sstream>
    
    #include <windows.h>
    
    template< typename T >
    bool to_clipboard( T value ) {
    
    	bool success( false ); 
    
    	for( unsigned int attempt_nr = 1; !( success = OpenClipboard( GetConsoleWindow( ) )  ) && ( attempt_nr <= 3 ); ++attempt_nr ) {
    
    		Sleep( 500 );
    	}
    
    	if( !( success && EmptyClipboard( ) ) ) {
    
    		return false;
    	}
    
    	std::stringstream ss;
    
    	ss << value;
    
    	void *global_mem_object = GlobalAlloc( GMEM_MOVEABLE, ss.str( ).length( ) + 1 );
    
    	if( !global_mem_object ) {
    
    		CloseClipboard( );
    		return false;
    	}
    
    	void *global_lock = GlobalLock( global_mem_object );
    
    	if( !global_lock ) { // shouldn't happen...
    
    		GlobalFree( global_mem_object );
    		CloseClipboard( );
    		return false;
    	}
    
    	std::strcpy( reinterpret_cast< char* >( global_lock ), ss.str( ).c_str( ) );
    
    	if( !SetClipboardData( CF_TEXT, global_lock ) ) {
    
    		GlobalUnlock( global_mem_object );
    		GlobalFree( global_mem_object );
    		CloseClipboard(	);
    		return false;
    	}
    
    	GlobalUnlock( global_mem_object );
    	CloseClipboard( );
    	return true;
    }
    
    int main( )
    {
    	to_clipboard( 1.234 );
    }
    

    greetz, Swordfish



  • Danke schonmal für die Antwort aber ich glaube wir müssen tiefer stapeln.

    Ich bin wie gesagt lediglich mit den basics vertraut...weder mit zeigern noch mit handles musste ich bis jetzt arbeiten.

    Was meinst du damit das ich einen falschen parameter übergebe?
    Und um ehrlich zu sein verstehe ich bei deinem code nur bahnhof. kannst du
    die relevanten stellen evtl. kommentieren für mich?

    danke
    seppi



  • SetClipboardData( ) erwartet als zweiten Parameter den Handle auf den Lock und nicht den Speicher an sich. Weiters wird bei Dir SetClipboardDate( ) immer fehlschlagen, da du OpenClipboard( ) 0 als Fensterhandle gegeben hast.

    Wenn du eben erst angefangen hast, C++ zu Programmieren, dann bring' Dir erstmal die Grundlagen bei, bevor Du mit der WinAPI spielst.

    greetz, Swordfish



  • Ich hab nicht die Wahl ist eine Projektarbeit die das übergeben eines Parameters nach excel beinhaltet.

    seppi



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hab es jetzt so gelöst. Vielleicht nicht schön aber es funktioniert.
    Der double Wert "timelag" wird in char umgewandelt und ins Clipboard kopiert.

    #include <stdlib.h>
    #include <stdio.h>
    #include <windows.h>
    
    int main( void )
    {   
    	/*********************************************/
    	// Umwandlung von double nach char
    	/*********************************************/
    
        char time[7];		         // Speicher reservieren
        double timelag = 0.12348; 	// Simulation der gemessenen Zeit
    
        _gcvt( timelag, 6, time );	// Wandlung double to char
    
    	/*********************************************/
    	// Schreiben ins Clipboard
    	/*********************************************/   							
    
        char *pszData;	         // Zeiger für den String
    
        char *t = time;	// Zeiger auf den Speicher von _gcvt
    
        HGLOBAL hData;         // Handle für einen Globalen Speicherblock
    
        LPVOID pData;          // Zeiger für den Globalen Speicherblock
    
        pszData = (char*)malloc(6);    // Speicher reservieren
    
        strcpy(pszData , t);	// unseren String erzeugen
    
        OpenClipboard(NULL);	// die Zwischenablage öffnen. Hier
    											// kann ein Handle einer offnen Zwischenablage
    											// eines anderen Fensters übergeben werden.
    											// Übergeben wir NULL so wird eine Zwischenablage
    											// für den aktuellen Task geöffnet.
    
        EmptyClipboard();      // die Zwischenablage leeren.
    
        hData = GlobalAlloc(GMEM_DDESHARE | 
    			GMEM_MOVEABLE, strlen(pszData) + 1);          
    
    											// Den Globalen Speicherblock allokieren. 
    											// Die Flags kann man der MSDN entnehmen. 
    											// Als Parameter 2 erwartet die Funktion 
    											// die Größe des benötigten Speicher.
    
        pData  =  GlobalLock(hData);      
    
    											// Den Zeiger auf den Globalen Speicherblock 
    											// setzen und den Speicherblock für andere Progs 
    											// sperren. Als Parameter übergeben wir unseren 
    											// Handle.
    
        strcpy((LPSTR)pData, pszData);  
    											// unseren String in den Speicherblock kopieren.
    
        GlobalUnlock(hData);	// Den Speicherblock wieder freigeben.
    
        SetClipboardData(CF_TEXT, hData);          
    											// Den Speicherblock in die Zwischenablage schieben
    											// Flags aus der MSDN entnehmen.
    
        CloseClipboard();	// die Zwischenablage wieder schließen.
    
    	return 0;
    }
    

Anmelden zum Antworten