Info: Clipboard-Verwaltung – Sicherheit und Microsoft-Richtlinien

⚠️ **WARNUNG!** Dieses Dokument enthält **kritisches technisches Wissen** über die korrekte und sichere Verwendung von Windows-Clipboard-Funktionen. Falsche Annahmen (z.B. dass `GetClipboardData(CF_TEXT)` automatisch ein `HGLOBAL` ist) führen zu **Abstürzen und Speicherleaks**. Die Inhalte sind **nicht für Anfänger** geeignet – sie erfordern Kenntnisse der Windows-API und der Unterschiede zwischen `HANDLE` und `HGLOBAL`. Bitte **lesen Sie den gesamten Text sorgfältig** – jede Aussage ist **dokumentiert und zitierbar**.

Die folgenden Aussagen stammen aus der offiziellen Microsoft-Dokumentation und sind entscheidend für die Entwicklung sicherer, korrekter C-Programme unter Windows.

📌 Microsoft-Richtlinie – Heap vs. Global Funktionen

„Neue Anwendungen sollten die Heapfunktionen verwenden, es sei denn, die Dokumentation besagt, dass eine globale Funktion verwendet werden soll.“

Das bedeutet:

🔍 Was bedeutet das für das Lesen des Clipboards?

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.

⚠️ Kritischer Punkt: 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.

Falsche Annahme: „GetClipboardData(CF_TEXT) gibt immer ein HGLOBAL zurück.“ → Dies ist falsch und gefährlich – führt zu Abstürzen bei ungültigen Handles.

✅ Sicherer Ansatz: Prüfung mit 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.

✅ Endgültige, sichere C-Funktion


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;
}
    

✅ Fazit – Klar und eindeutig

Obwohl neue Anwendungen Heapfunktionen bevorzugen, ist GlobalLock für das Lesen des Clipboards notwendig – und die Microsoft-Dokumentation gibt diesen Fall explizit vor.

Warum?

📝 Zusammenfassung in einem Satz: 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.“
Quelle: Microsoft Learn – GetClipboardData