vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
Bitmap Handle (GetClipboardData) löschen, ja oder nein? 
Autor: UnixRulez
Datum: 14.04.05 11:54

Ich habe folgendes Problem mit der Funktion:
GetClipBoardData(wFormat as long) as long
1. Wenn die Funktion mit dem Parameter CF_BITMAP aufgerufen wird, liefert diese ein
GDI Handle auf eine Bitmap. Dieses wird dann mittels SelectObject in einen HDC eingefügt und alles ist gut.
2. Bevor dann 1. wiederholt wird, will ich vorher das Bitmap handle wieder freigeben
DeleteObject(hBMP) liefert 0 ==> Das GDI Object konnte nicht gelöscht werden

Nun die Preisfrage:
Ist das Bitmap handle welches von getClipboardData zurückgegeben wird irgendwie
ein spezielles Handle, das nicht gelöscht werden kann bzw. darf?

Die Online Windows API Referenz von "Ziemlich Klein Weich" oder die ZKW-DN gibt
leider keine genaue Information was es mit dem Bitmap handle auf sich hat.

vielen Dank im voraus

------------------------------
Geht nicht, gibts nicht!
------------------------------

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bitmap Handle (GetClipboardData) löschen, ja oder nein? 
Autor: Zardoz
Datum: 14.04.05 13:10

Hallo UnixRulez,
du kannst einen Handle nicht löschen, wenn er einem DC
zugeordnet ist.

Gruss,

Zardoz

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bitmap Handle (GetClipboardData) löschen, ja oder nein? 
Autor: UnixRulez
Datum: 14.04.05 16:12

Das ist vollkommen richtig Zardoz...
aber nicht mein Problem. Der DC wird vorher gelöscht:
    'Wenn ein gültiger DC da, dann löschen
    If hdc <> 0 Then
        gdiRet = DeleteDC(hdc)
        Debug.Assert gdiRet <> 0
    End If
    'Falls ein gültiges Bitmap handle vorhanden, freigeben
    'Dieses ist das Handle welches von der Funktion GetClipboardData zurück
    'gegeben wurde
    If hBmp <> 0 Then
        gdiRet = DeleteObject(hBmp)
        Debug.Assert gdiRet <> 0        'Hier krachts, da DeleteObject Null 
        ' liefert
    End If
trotzdem vielen Dank für die Antwort

UnixRulez

------------------------------
Geht nicht, gibts nicht!
------------------------------

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Bitmap Handle (GetClipboardData) löschen, ja oder nein? 
Autor: Zardoz
Datum: 14.04.05 17:01

Hallo UnixRulez,
mit DeleteDC werden alle, dem DC zugeordneten Objekte, gelöscht,
vorrausgesetzt, sie sind nicht noch einem anderen DC zugeordnet.
Da der DC schon beim Anlegen einen Handle hat, bleibt er, so wie
du das jetzt machst, im Speicher zurück.

Gruss,

Zardoz

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Fragestellung hat sich geändert 
Autor: UnixRulez
Datum: 14.04.05 17:58

Wenn ein DC gelöscht wird werden mitnichten die Objecte die ihm zugeordnet sind
gelöscht. Das anzunehmen ist ein grosser Fehler (Resourcenfresser).

Zu dem angeblich zurückbleibenden Handle: Da brennt nix an, weil nach Erzeugung des DC's beim ersten mal das so aufgerufen wird:
ret = DeleteDC(SelectObject(hDC,hBmp))
Und hier liegt auch der Hund begraben. Durch intensives Debugging habe ich
entdeckt, dass das handle, welches von GetClipboardData geliefert wird, jedes mal
dasselbe war. Ich denke um allen Eventualitäten entgegenzukommen werde ich so
vorgehen:

1. hBMP = GetClipBoardData(CF_BITMAP)
2. hBMP_Old = SelectObject(hDC,hBMP)
3. if hBMP <> hBMP_Old and hBMP_Old <> 0 then call DeleteObject(hBMP_Old)

Bleibt allerdings die mysteriöse Frage:
Wie geht es an, dass getClipBoardData immer dasselbe Handle zurückliefert?

Die Applikation A welche Daten in das Clipboard stellt macht dies auf Anforderung von
Applikation B per SendMessage und stellt jedesmal aufs neue Daten in das Clipboard
welche dann von Applikation B nach der Rückkehr des SendMessage Befehls
ausgelesen werden.

------------------------------
Geht nicht, gibts nicht!
------------------------------

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Addendum zu Fragestellung hat sich geändert 
Autor: UnixRulez
Datum: 15.04.05 09:55

Ergänzend wollte ich noch feststellen, dass man grundsätzlich vor dem Löschen
eines Device Contexts immer die GDI Objekte die bei dem
vorHerigesGDIObj = SelectObject(meinHDC, irgendEinNeues_GDIObj)
zurückgeliefert werden wieder in den HDC selektiert. Dies gilt vor allem wenn
man den HDC nicht selber mittels eines Create... Aufrufs erzeugt. Ein mit getDC
erlangter Device Context kann Objekte beinhalten und die kann man nach einem SelectObject nicht einfach löschen, da ein anderer Teil der Anwendung darauf vertraut,
dass diese noch gültige Handles darstellen.

------------------------------
Geht nicht, gibts nicht!
------------------------------

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel