Verständnissfrage zu HANDLEs (z.B. Events kopieren)



  • Guten Morgen! 🙂

    Ich habe mich gerade mit Events beschäftigt und zwei Klassen geschrieben, die entsprechende WinAPI-Funktionen (CreateEvent, WaitForSingleObject, WaitForMultipleObjects, CloseHandle) kapseln.

    Dabei ist mir aufgefallen, dass ich eigentlich (fast) nichts über HANDLEs weiß. Vor allem stelle ich mir die Frage, ob man HANDLEs einfach kopieren darf.

    Zum Beispiel: In zwei Objekten möchte ich auf das selbe Event reagieren. Das Event soll als Member in den Objekten gespeichert werden. Muss das HANDLE dann irgendwo erzeugt werden und als Referenz oder via Zeiger an die Objekte weitergegeben werden, oder geht auch ein Copy-By-Value?

    Möchte jemand Kaffee? Milch, Zucker...? 🙂



  • Du kannst HANDLES im Prinzip wie Zeiger kopieren.
    D.h. du kannst ohne weiteres mehrere Klassen haben wo das HANDLE einfach "by value" kopiert wurde, aber du musst sicherstellen, dass es nur 1x freigegeben wird (CloseHandle).

    Wenn du ein HANDLE so kopieren willst, dass du es 2x mit CloseHandle zumachen kannst, musst du DuplicateHandle verwenden. Dann bekommst du einen neuen HANDLE Wert, der auf das selbe Objekt verweist, aber eben getrennt "geschlossen" werden kann (muss).



  • Danke hustbar. Ich habe es vermutet aber nicht gewusst.

    In meinem Event-Konzept ist es eh so geregelt, dass meine Event-Objekte (die die WinApi kapseln) nur als Smart-Pointer "im Umlauf" sind. Daher wird sicher gestellt, dass pro Event es nur ein Objekt gibt und dieses dann bei seiner Zerstörung den HANDLE per CloseHandle() freigibt.

    Hat mich aber mal interessiert, ob man auch die HANDLEs kopieren kann. Als ich dazu suchte, fand ich nirgendwo mal ein Hinweis, dass das geht oder jemand macht. Wenn z.B. Event-Handles verteilt wurden, dann oftmals via gemeinsamen Variablenzugriff oder per Aufruf durch OpenEvent().



  • OpenEvent kann man nehmen, wenn das Ding einen Namen hat, und man den Namen kennt, ja.
    Sonst wie erwähnt DuplicateHandle. (DuplicateHandle hab' ich kaum jemals irgendwo gebraucht)

    Üblich ist es, solche "HANDLE Wrapper-Klassen" einfach "noncopyable" zu machen. Dann kann man die garnicht kopieren/zuweisen, kann also nix falsch machen. Rumreichen tut man die dann als (shared_)ptr.



  • hustbaer schrieb:

    Üblich ist es, solche "HANDLE Wrapper-Klassen" einfach "noncopyable" zu machen. Dann kann man die garnicht kopieren/zuweisen, kann also nix falsch machen. Rumreichen tut man die dann als (shared_)ptr.

    Ganz genau so mache ich es auch (Uncopyable + Fabrikmethode + boost::shared_ptr).

    (Endlich mache ich etwas richtig! Für irgendwas muss das ganze Foren-Lesen ja gut sein^^ ;))


Anmelden zum Antworten