Clipboard überprüfen ob Datei oder Text
-
Guten Morgen!
Bezüglich dem Clipboard weiß ich so viel: Bei Text wird der Text gespeichert,
bei einer Datei wird, wenn sie größer ist, deren Pfad als String in den Clipboard
gespeichert. Jetzt habe ich folgendes Problem:Ich lese den Clipboard aus, den daraus resultierten String überprüfe ich auf einen
vorgegeben String. Ist dieser String vom Clipboard ähnlich dem Vorgegeben so
ändere ich diesen ab. Nun habe ich dieses kleine Programm in den Autostart getan,
doch es stürzt beim Start (nach der Anmeldung) ab. Ebenfalls wenn ich jetzt vorher
mit STRG + C eine Datei kopiert habe, stürzt das Programm ab und gibt einen Lese-
fehler an der Adresse 0x0000000 aus.Hier der Source-Code, dort wo ich aus testzwecken (um selber hinter die Lösung zu
kommen) herumdoctort habe ist es kommentiert.void ProLinkProg(){ char cpylink[MAX_LINK_LENG]; char prelink[]="http://"; char pastlink[MAX_LINK_LENG]; char cpyPreLink[]="ftp://beweisevomteam@"; strcpy(cpylink, getStringFromClipboard(cpyPreLink)); if(getStringFromClipboard != NULL && strstr(cpylink, cpyPreLink)){ strcpy(pastlink, prelink); DeleteCpyPreLink(cpylink, cpyPreLink); strcat(pastlink, cpylink); copyToClipboard(pastlink); } } char * getStringFromClipboard(char cpyPreLink[]) { int ok = OpenClipboard(NULL); char * cBuffer = NULL; if (!ok) return NULL; HANDLE hClipData = GetClipboardData( CF_TEXT ); cBuffer = (char*)GlobalLock( hClipData ); GlobalUnlock( hClipData ); CloseClipboard(); if(strlen(cBuffer)>=MAX_LINK_LENG || strlen(cBuffer) <= strlen(cpyPreLink)) // Versuch: wenn dateilänge zu hoch dann setze erstes zeichen vom string auf 0 cBuffer[0]='\0'; } return cBuffer; }
Ich habe in Google gesucht, jedoch wird meistens nur darüber geschrieben wie man
einen Text ausliest, jedoch nicht wie man ausliest ob es jetzt ein Text oder
eben eine Datei ist.Über Antwort wär ich sehr Dankbar.
Mit freundlichen Grüßen
ITEDVO[PS]: Kann wieder geclosed werden, ich hab das Problem gefunden. Wie ein Blitz ist
die Lösung in mich gefahren ^^char * getStringFromClipboard(char cpyPreLink[]) { int ok = OpenClipboard(NULL); char cBuffer[MAX_LINK_LENG] = {0}; // vordefinierte Größe festlegen if (!ok) return NULL; if(GetClipboardData(CF_TEXT)){ // wenn string HANDLE hClipData = GetClipboardData( CF_TEXT ); strcpy(cBuffer, (char*)GlobalLock( hClipData )); GlobalUnlock( hClipData ); CloseClipboard(); if(strlen(cBuffer)>=MAX_LINK_LENG || strlen(cBuffer) <= strlen(cpyPreLink)) cBuffer[0]='\0'; } return cBuffer; }
-
Dein Code funktioniert eventuell mit deinem jetzigen Compiler, aber die Rückgabe des lokalen Arrays (cBuffer) ist natürlich undefiniert und somit falsch.
Soll das Ganze eigentlich in C programmiert werden, oder kanns auch etwas C++ sein?
Edit: Übrigens, du öffnest die Zwischenablage und schließt sie nur, wenn Text verfügbar ist.
Edit 2: Und deine letzte Überprüfung gefällt mir ganz und gar nicht. Wie soll denn strlen größer sein als die Größe des Arrays selbst?
Das Kopieren und damit ein möglicher Pufferüberlauf hat auch schon vorher stattgefunden.
-
ja ich muss es noch ausbessern, daran hab ich schon gearbeitet. diese fehler
sind bereits weg =bUnd ja es sollte C sein, denn mit C++ hab ich schlichtweg wenig erfahrung.
char * getStringFromClipboard(char cpyPreLink[]) { int ok = OpenClipboard(NULL); char cBuffer[MAX_LINK_LENG] = {0}; if (!ok){ CloseClipboard(); return NULL; } if(GetClipboardData(CF_TEXT)){ HANDLE hClipData = GetClipboardData( CF_TEXT ); if(!(strlen((char*)GlobalLock(hClipData)) > MAX_LINK_LENG || strlen((char*)GlobalLock(hClipData)) <= strlen(cpyPreLink))){ strcpy(cBuffer, (char*)GlobalLock( hClipData )); GlobalUnlock( hClipData ); } } CloseClipboard(); return cBuffer; }
und bezüglich der Überprüfung von: strlen((char*)GlobalLock(hClipData)) <= strlen(cpyPreLink) wird überprüft ob der String im Clipboard kleiner Gleich des
vorgegebnen Strings ist um unnötige Arbeit zu verhindern:Ist es kleiner aber != NULL oder gar gleichgroß: so ist der String CpyPreLink
im cBuffer enthalten. Jetzt wäre die Bedingung:if(getStringFromClipboard != NULL && strstr(cpylink, cpyPreLink))
True und er würde Arbeiten, jedoch
würde dann wiederum nur noch http:// im Clipboard stehen. Wenn es kleiner wäre
würde er bei dieser Bedingung beide Abfragen auswerten, unnötige Arbeit wenn
es ja eh kleiner ist.