Was ist ein handle in der Software
-
Ich habe mir mal die MFC Sourcen genauer angeschaut. Ich kann in diesen Bibliotheken keine in sich geschlossene Vorgehensweise erkennen. Es schaut alles irgendwie herumgedoktert aus. Über .NET kann ich nicht mitreden.
Sicherlich kann man einen Zeiger zurückgeben um gewisse Informationen zu bekommen. Die Diskussion hier in diesem Thread beweißt mir eigentlich, dass es doch keine einheitliche Vereinbarung existiert.Handle == Zeiger oder ID Nummer??
Außerdem sehe ich einen Unterschied zwischen Embedded World und Windows World.
Leider kann ich über die Linux Welt nichts sagen. Vielleicht gibt es Linux World Forumteilnehmer, die sich dazu äußern könnten.
-
Man soll gar nicht wissen was hinter einem Handle steckt.
-
handle schrieb:
Man soll gar nicht wissen was hinter einem Handle steckt.
Sogar noch ganz anders: Man will es einfach gar nicht.
(btw. ein Handle muss auch keine Zahl sein)
-
@krasstala:
Du machst dir zuviele Gedanken um Handles. Das Wort Handle ist einfach nur ein abstrakter Begriff. Was genau dahinter steckt ist nicht wichtig und soll auch nicht wichtig sein. Ein Handle ist nichts, was fest in der Programmiersprache eingebaut ist und erst recht kein Standard. Im Prinzip wurde das so ähnlich dir jetzt schon ein paar mal gesagt.Was Handles genau sind kann von API zu API oder Bibliothek zu Bibliothek anders sein. Sogar innerhalb einer bestimmten API können sie anders implementiert sein (siehe WinAPI). Meistens taucht das Wort Handle in Sprachen auf, die keine direkten Sprachmittel zur objektorientierten Programmierung bieten. Beispielsweise C oder Pascal. Böse gesagt ist das dann OOP für Arme.
Hier mal ein Beispiel in Pseudocode:
FensterHandle mein_fenster = fenster_erstellen(10, 10, 200, 200, "Test-Fenster"); fenster_zeigen(mein_fenster); fenster_setze_titel(mein_fenster, "Ein anderer Titel"); fenster_schliessen(mein_fenster);
Würde man das in einer Sprache mit OOP-Sprachmitteln machen, wäre mein_fenster eine Instanz von Fenster:
Fenster mein_fenster(10, 10, 200, 200, "Test-Fenster"); mein_fenster.zeigen(); mein_fenster.setze_titel("Ein anderer Titel"); mein_fenster.schliessen();
krasstala schrieb:
Leider kann ich über die Linux Welt nichts sagen. Vielleicht gibt es Linux World Forumteilnehmer, die sich dazu äußern könnten.
Unter Linux ist das auch nicht anders. Es gibt Bibliothek in denen der Begriff Handle auftaucht, um das zu erreichen was ich dir gerade erklärt habe.
-
Ein Handle is ein bitwise kopierbares, meist der Größe eines Maschinenwortes entsprechendes Objekt das zur Referenzierung anderer meist nicht trivialer Objekte dient. So sind nun alle Klarheiten beseitigt? :p
CPU Speicher Handles werden oft als "Zeiger" bezeichnet. Jedoch sind "Zeiger" im eingentlichen Sinn des Wortes nicht so restriktive zu sehen und bezeichnen allgemein ein zeigendes im Sinn von referenzierendes Objekt.
-
kingruedi schrieb:
handle schrieb:
Man soll gar nicht wissen was hinter einem Handle steckt.
Sogar noch ganz anders: Man will es einfach gar nicht.
bis hierhin:
Wenns ein Zeiger wäre, müsste man ja wissen was es ist, man bräuchet ja den Typ zum dereferenzieren.
Und versuche mal wer ein Handle zu dereferenzieren ...
Ziel ist es ja eben den direkten Zugriff zu unterbinden. Wenn man jetzt weis, was man mit Zeigern so alles anstellen kann, dürfte klar sein, dass ein Handle kein Zeiger ist.
-
Oft steckt hinter einem Handle auch ein normaler Zeiger in den Speicher. Dann kann man es auch dereferenzieren.
-
............... schrieb:
Oft steckt hinter einem Handle auch ein normaler Zeiger in den Speicher. Dann kann man es auch dereferenzieren.
...............
-
Pellaeon schrieb:
Ziel ist es ja eben den direkten Zugriff zu unterbinden. Wenn man jetzt weis, was man mit Zeigern so alles anstellen kann, dürfte klar sein, dass ein Handle kein Zeiger ist.
Nö. Ziel ist es einfach nur, wiederverwendbare funktionen zu schreiben, die es mir ermöglichen die selben Funktionen auf verschiedene Objekte auszuführen. Das beste Beispiel dafür sind die f*-Funktionen. (fopen, fclose, fgets, fputs, etc.)
Ich finde den Post von "yet_another_kenner" eigentlich am besten zutreffend.
krasstala schrieb:
Außerdem sehe ich einen Unterschied zwischen Embedded World und Windows World.
Welchen/Wieso?
-
junix schrieb:
Das beste Beispiel dafür sind die f*-Funktionen. (fopen, fclose, fgets, fputs, etc.)
Stimm ich dir voll zu: Dateiarbeit ist ein schönes Beispiel: da werden kein Zeiger rausgegeben. Man erhält lediglich eine Nummer: das File-Handle.
-
Pellaeon schrieb:
Stimm ich dir voll zu: Dateiarbeit ist ein schönes Beispiel: da werden kein Zeiger rausgegeben. Man erhält lediglich eine Nummer: das File-Handle.
... ist aber nicht das allein gültige Beispiel! Was ist denn schlussendlich ein Zeiger? Nichts weiter als der Index eines riesigen (2n, also z.B. 232 = 4294967296 Arrayplätze) Arrays.
Es ist völlig irelevant, was hinter einem Handle Steckt. Das Handle ist einfach ne eindeutige ID, welche es ermöglicht, Funktionen mehrfach verwendbar zu machen. Nichts weiter. Wie das im Einzelnen implementiert ist, liegt in der Kompetenz der einzelnen Softwerker.
-
junix schrieb:
Das Handle ist einfach ne eindeutige ID
Sag ich doch die ganze Zeit!! Und nen Zeiger beinhaltet ne Adresse und keine ID.
Das sind nunmal 2 verschiedene Konzepte. Sie haben zwar dasselbe Ziel: Zugriff auf irgend etwas, aber der Weg zum Ziel ist nunmal ein anderer.
-
[quote="junix"]
Pellaeon schrieb:
Es ist völlig irelevant, was hinter einem Handle Steckt. Das Handle ist einfach ne eindeutige ID, welche es ermöglicht, Funktionen mehrfach verwendbar zu machen. Nichts weiter. Wie das im Einzelnen implementiert ist, liegt in der Kompetenz der einzelnen Softwerker.
Nein, es kann mehr als ne ID sein. Bei nem aktuellen Projekt werden in C auch Handles verwendet, aber die behalten ne ID, nen Mapping in einem Speicherbereich, verschiedene Flags usw.
Ich find bisher auch den Post von yet_another_kenner am passensten das damit ein wenig versucht wird OOP zu betreiben, weils Objekte ja gerade in C nicht gibt, man aber irgendwie trotzdem sowas ähnliches brauch um immer darauf zugreifen zu können.
-
Talla schrieb:
Nein, es kann mehr als ne ID sein. Bei nem aktuellen Projekt werden in C auch Handles verwendet, aber die behalten ne ID, nen Mapping in einem Speicherbereich, verschiedene Flags usw.
Woraus resultiert, das dein "Handle" nichts weiter als ein Zeiger ist, der - wie ich weiter oben festgestellt hatte - auch nichts weiter als eine ID für ein bestimmtes Element des Arrays "Speicher" ist.
Man kann sich auch gut an der Übersetzung von "Handle" ins Deutsche orientieren: "Handle" heisst nichts anderes als "Griff" ... wo der Griff nun aber befestigt ist (ein ganzes Objekt, nur eine Struktur oder einfach nur ein einzelnes Byte) ist völlig egal. Es soll nur einfach bestimmte Daten wieder greifbar machen, wenn eine Funktion aus einer Bibliothek aufgerufen wird.
-
@junix wie definierst du Zeiger?
Ich verstehe darunter eine Variable, welche eine Adresse enthält. Eine ID ist keine Adresse für mich. Das ist eher sowas wie ein Primary Key. Ich kann jemand damit identifizieren. Darum muss ich aber noch lange nicht wissen, wo er wohnt.
Daher ist für mich ein Handle kein Zeiger. Hinter dem Handle kann ein Zeiger stecken, ja klar, oder ne Datei oder sonstwas, aber das Handle an sich ist doch kein Zeiger. Zumindest nicht im Sinne eines Zeigers in C/C++/Pascal/usw.
-
Pellaeon schrieb:
@junix wie definierst du Zeiger?
Ich mag keine Selbstzitate, aber:
junix schrieb:
Was ist denn schlussendlich ein Zeiger? Nichts weiter als der Index eines riesigen (2n, also z.B. 232 = 4294967296 Arrayplätze) Arrays.
Nenn das Array Speicher und du hast exakt die Situation... Ist lediglich eine abstraktere Sichtweise.
-
Interessante Diskussion, Leute! Weiter so...
-
junix schrieb:
Pellaeon schrieb:
@junix wie definierst du Zeiger?
Ich mag keine Selbstzitate, aber:
junix schrieb:
Was ist denn schlussendlich ein Zeiger? Nichts weiter als der Index eines riesigen (2n, also z.B. 232 = 4294967296 Arrayplätze) Arrays.
Nenn das Array Speicher und du hast exakt die Situation... Ist lediglich eine abstraktere Sichtweise.
*gg* Dann caste dein Handle mal zu nem Zeiger(oder du musst das ja nicht machen, ist ja schon ein Zeiger bei dir) und nun greif mal drauf zu. Ich schätze dann wirst ne Überraschung erleben ... . Wenns ein Zeiger ist, dürfte ja nix passieren.
-
Vielleicht könnte man sagen es gibt direkte Zeiger und indirekte Zeiger und Handles sind meistens indirekte Zeiger.
-
junix schrieb:
Ist lediglich eine abstraktere Sichtweise.
Denk darüber nach und über den Rest der hier gesagt wurde. Und tu dir selber nen Gefallen und meld dich erst wieder wenn dus auch verstanden hast.