Die folgenden Aussagen stammen aus der offiziellen Microsoft-Dokumentation und sind entscheidend für die Entwicklung sicherer, korrekter C-Programme unter Windows.
„Neue Anwendungen sollten die Heapfunktionen verwenden, es sei denn, die Dokumentation besagt, dass eine globale Funktion verwendet werden soll.“
Das bedeutet:
HeapAlloc / HeapFree für Puffer-Verwaltung (z.B. für `ReadClipboardText`).GlobalAlloc / GlobalLock nur dann, wenn die Dokumentation explizit sagt, dass es erforderlich ist.| Aussage | Bedeutung |
|---|---|
| Höherer Mehraufwand | GlobalAlloc, GlobalLock sind systemeigene Funktionen mit höherem Systemaufwand und sind nicht für alle Anwendungsfälle optimiert. |
| Weniger Features | Global-Funktionen bieten weniger Flexibilität und sind weniger geeignet für moderne C-Programme. |
| Neue Anwendungen → Heapfunktionen | Verwende HeapAlloc / HeapFree für Puffer-Verwaltung – das ist die empfohlene Methode. |
GetClipboardData(CF_TEXT) gibt kein HGLOBAL zurück!
Wichtige Korrektur: Die Funktion GetClipboardData(CF_TEXT) gibt ein HANDLE zurück – kein HGLOBAL!
Die offizielle Dokumentation sagt nichts über die Art des Handles:
„The GetClipboardData function returns a handle to the data in the clipboard.“
→ Das ist ein allgemeines Handle (z.B. zu Fenstern, Dateien, Prozessen).
→ Es ist keine Garantie, dass es ein HGLOBAL ist.
GlobalLock
Die einzige sichere Methode, um das Clipboard zu lesen, ist die **Ausführung von GlobalLock und die Prüfung des Rückgabewerts**.
Wenn GlobalLock(hData) NULL zurückgibt → das Handle ist ungültig oder nicht für GlobalLock geeignet → Fehler.
char* ReadClipboardText() {
HANDLE hData = GetClipboardData(CF_TEXT);
if (!hData) {
return NULL;
}
void* p = GlobalLock(hData);
if (!p) {
return NULL;
}
char* text = (char*)p;
DWORD len = strlen(text);
if (len == 0) {
GlobalUnlock(hData);
return NULL;
}
HANDLE hHeap = GetProcessHeap();
void* pBuf = HeapAlloc(hHeap, 0, len + 1);
if (!pBuf) {
GlobalUnlock(hData);
return NULL;
}
char* buf = (char*)pBuf;
memcpy(buf, text, len + 1);
GlobalUnlock(hData);
return buf;
}
Obwohl neue Anwendungen Heapfunktionen bevorzugen, ist GlobalLock für das Lesen des Clipboards notwendig – und die Microsoft-Dokumentation gibt diesen Fall explizit vor.
Warum?
GetClipboardData(CF_TEXT) gibt ein HANDLE zurück – kein HGLOBAL.GlobalLock auf NULL.HeapAlloc / HeapFree ist die richtige, empfohlene Methode für Puffer-Verwaltung.GetClipboardData(CF_TEXT) gibt ein HANDLE zurück – nicht automatisch ein HGLOBAL. Es ist nicht sicher, davon auszugehen, dass es ein HGLOBAL ist. Die einzige sichere Methode ist, GlobalLock auf das Handle anzuwenden und auf NULL zu prüfen – falls es fehlschlägt, ist das Handle ungültig oder nicht für GlobalLock geeignet.“