zwischenablage lesen und schreiben - kontrolle bitte + paar fragen
-
Hallo,
ich möchte mit einem Programm in C meine zwischenablage auslesen, mit dem inhalt dann irgendwas machen und dann etwas neues in die zwischenablage packen.
ich hab auch schon einen funktionierenden code hinbekommen und wollte euch bitten mal drüberzuschauen, ob ich so alles korrekt gemacht habe oder ob ich fehler drin habe, die der compiler vielleicht ignoriert.meine main:
#include <stdio.h> #include <Windows.h> #include <string.h> #define TEMPDATEI "zwischenablage.txt" void inclip(char *string); void ausclip(void); int main(){ FILE * datei; char string[1000]; ausclip(); if (datei = fopen(TEMPDATEI, "r")) { fgets(string, 1000, datei); inclip(string); } return 0; }
funktion ausclip:
void ausclip(void){ FILE *datei = NULL; if ((datei = fopen(TEMPDATEI, "w")) != NULL) if (OpenClipboard(0)){ HANDLE *clipdata = GetClipboardData(CF_TEXT); fprintf(datei, "%s\r", clipdata); CloseClipboard(); fclose(datei); } }
funktion inclip:
void inclip(char*strData){ char * pchData = NULL; if (OpenClipboard(0)) { EmptyClipboard(); HGLOBAL hClipboardData; hClipboardData = GlobalAlloc(GMEM_MOVEABLE, strlen(strData) + 1); if (hClipboardData == NULL) return EXIT_FAILURE; pchData = (char*)GlobalLock(hClipboardData); strcpy(pchData, (LPCSTR)strData); GlobalUnlock(hClipboardData); SetClipboardData(CF_TEXT, hClipboardData); CloseClipboard(); } }
nun kann ich als parameter für GlobalAlloc auch GMEM_FIXED benutzen und dann ist der rückgabewert der funktion gar kein handle sonder ein pointer. ich muss es dann also nicht mehr mit GlobalLock in einen pointer übersetzen oder?
würden dann statt dem oberen code für inclip auch das hier reichen?
void inclip(char*strData){ char * pchData = NULL; if (OpenClipboard(0)) { EmptyClipboard(); pchData = (char *) GlobalAlloc(GMEM_FIXED, strlen(strData) + 1); if (pchData == NULL) return EXIT_FAILURE; strcpy(pchData, (LPCSTR)strData); SetClipboardData(CF_TEXT, pchData); CloseClipboard(); } }
es funktionieren beide codes problemlos. aber funktionieren heißt ja nicht immer, dass das auch richtig ist. und verstehen möchte ich es auch noch.
wann z.b. sollte ich GMEM_FIXED nutzen und wann GMEM_MOVEABLE?lg
bluebird
-
Wie ware es zuerst die Doku zu verwenden und dann das Forum?
http://msdn.microsoft.com/en-us/library/windows/desktop/ms649051(v=vs.85).aspx
If the hMem parameter identifies a memory object, the object must have been allocated using the function with the GMEM_MOVEABLE flag.
-
danke. die doku hatte ich natürlich schon gelesen. aber wohl nicht gründlich genug, bzw. hatte ich schon die hälfte vergessen, als ich variante2 für inclip geschrieben habe.
dann fällt die variante2 natürlich weg.meine funktion ausclip ist wohl so auch nicht korrekt, oder?
verstehe ich das richtig, dass man immer erst globallock benutzen muss um ein handle verwenden zu dürfen?
dann müsste die funktion ja richtig so aussehen, oder?
void ausclip(void){ FILE *datei = NULL; char *temp = NULL; if ((datei = fopen(TEMPDATEI, "w")) != NULL) if (OpenClipboard(0)){ HANDLE *clipdata = GetClipboardData(CF_TEXT); temp = (char *)GlobalLock(clipdata); fprintf(datei, "%s\r", temp); GlobalUnlock(clipdata); CloseClipboard(); fclose(datei); } }
oh... ich glaub ich versteh erst jetzt, was dieses GlobalLock und GlobalUnlock soll. GlobalLock fixiert den handle auf einen bestimmten speicherbereich. erst danach kann ich den sicher auslesen. ansonsten könnte es auch passieren, dass irgendein anderer prozess darauf zugreift und der sich vielleicht einfach wegbewegt. und GlobalUnlock erlaubt ihm wieder sich zu bewegen, damit andere prozesse wieder darauf zugreifen können.
hab ich das richtig verstanden?
-
Die geöffnete Datei sollte auch geschlossen werden, falls Clipboard NICHT geöffnet wurde !!!
-
bluebird87 schrieb:
oh... ich glaub ich versteh erst jetzt, was dieses GlobalLock und GlobalUnlock soll. GlobalLock fixiert den handle auf einen bestimmten speicherbereich. erst danach kann ich den sicher auslesen. ansonsten könnte es auch passieren, dass irgendein anderer prozess darauf zugreift und der sich vielleicht einfach wegbewegt. und GlobalUnlock erlaubt ihm wieder sich zu bewegen, damit andere prozesse wieder darauf zugreifen können.
hab ich das richtig verstanden?So ähblich...
Warum bitte fprintf?
Einfacher ist fputs und fwrite....
-
danke für eure antworten
DerAltenburger schrieb:
Die geöffnete Datei sollte auch geschlossen werden, falls Clipboard NICHT geöffnet wurde !!!
upps. war nur schusseligkeit von mir
. habs geändert
Martin Richter schrieb:
Warum bitte fprintf?
Einfacher ist fputs und fwrite....dafür gabs keinen grund glaube ich. fputs dürfte wohl genau so gut funktionieren. aber ist das denn wirklich soviel einfacher? fprintf ist doch auch einfach.
-
...