OS-GUI Programmierung



  • Hallo!
    Also erstmal vorab: Hier geht es nicht um Assembler, allgemeine OS-Programmierung und dergleichen. Mich interessiert nur aus reiner Neugierde wie so ne GUI fuer ein OS programmiert wurde!
    Ich frage mich schon laenger wie ueberhaupt die WinAPI programmiert wurde. Es heisst immer sie waere in C geschrieben - wenn ja, wie denn ohne API?
    Was passiert hinter den Kulissen von Funktionen wie MessageBox() oder CreateWindow() - wie funktioniert diese?
    Koennte man sich theoretisch ein eigenes Windows-Fenster ohne API schreiben? Ginge sowas denn?

    Bin ein absoluter N00b in diesem Gebiet. Wuerde mich ueber Antworten freuen 🙂



  • Eric Cartman schrieb:

    Ich frage mich schon laenger wie ueberhaupt die WinAPI programmiert wurde. Es heisst immer sie waere in C geschrieben - wenn ja, wie denn ohne API?

    Das ist doch die API. Die wurde natürlich "aus dem Nichts" programmiert, klar. Die ganze Windows-Sache musste ja auch erst mal aufgebaut werden. Ein Fenster wird zwar "automatisch" gezeichnet, wenn du ShowWindow aufrufst, aber diese Zeichenroutine musste ja schließlich erst mal einer schreiben...



  • Eric Cartman schrieb:

    Hallo!
    Also erstmal vorab: Hier geht es nicht um Assembler, allgemeine OS-Programmierung und dergleichen. Mich interessiert nur aus reiner Neugierde wie so ne GUI fuer ein OS programmiert wurde!
    Ich frage mich schon laenger wie ueberhaupt die WinAPI programmiert wurde. Es heisst immer sie waere in C geschrieben - wenn ja, wie denn ohne API?
    Was passiert hinter den Kulissen von Funktionen wie MessageBox() oder CreateWindow() - wie funktioniert diese?
    Koennte man sich theoretisch ein eigenes Windows-Fenster ohne API schreiben? Ginge sowas denn?

    Bin ein absoluter N00b in diesem Gebiet. Wuerde mich ueber Antworten freuen 🙂

    Die WinAPI benutzt natürlich die "native API", das ist eine API die mit dem Kernel kommuniziert. Mit einer Ausnahme: die GDI kommuniziert direkt mit dem Kernel, d.h. das Zeichnen der Grafiken erfolgt nicht über einen zusätzlichen Layer.

    Nun fragst du dich natürlich wie man mit dem Kernel kommuniziert, das geht über sogenannte "System Calls", diese ruft man für gewöhnlich auf indem man in bestimmte Register bestimmte Werte schreibt und dann einen bestimmten Interrupt auslöst, der wird von einem Interrupt-Handler des Betriebssystems gefangen und der siehst dann anhand der Werte in den Registern welchen System Call du aufrufen möchtest, prüft dann deine Daten (ganz wichtig, wegen der Sicherheit!) und führt das ggf. durch und schreibt dir die Ergebnisse wieder in Register bzw. auf deinen Stack.
    Das ist natürlich unhandlich deshalb gibts die native API, damit die Winapi-Programmierer das nicht immer von Hand machen müssen.



  • Ansonsten gibt es Open Source GUI-APIs wie z.B. X11.
    Kannst dir das ja mal anschauen, vll. hilft es dir weiter,
    das Ganze zu verstehen.

    mfg Branleb



  • Ist doch eigentlich ganz einfach: du mußt natürlich Lowlevel anfangen, bevor du die öffentliche API entwickelst. D.h. du mußt erstmal Funktionen schreiben, um eine Pixel zu zeichnen. Dann machst du eine Funktion die mit Pixeln eine Linie zeichnet. Dann machst du eine Funktion die aus Linien ein Rechteck zeichnet... usw. usf. irgendwann kannst du du eine Funktion die viellichet heißt drawWindow() eine Fenster zeichnen.

    Irgendwann hast du soviele Lowlevel-Funktionen, das du Anwender Highlevel-Funktionen anbieten kannst. Hilevel-Funktionen (also die Win32-API) ruft am Ende nur viele Lowlevel-Funktionen auf (vielleicht auch andere Hilevel-Funktionen).

    Wie zeichnet man einen Pixel? Dazu muß man ja wissen, wie man Grafikprogrammierung macht. Und dazu muß man halt wissen, wie ein Grafikchip arbeitet. Auf einem C64 hat man einfach in einen bestimmten Speicherbereich Byte-Werte gesetzt. Das kann man heute auch mit C machen, einfach einen Pointer nehmen und nen Wert setzen... dann müsste sich auf dem Bildschirm ein Pixel in der Farbe ändern.
    Heute muß man den Grafikkartentreiber fragen, weil PCs unterschiedliche Chips haben.



  • Bulli schrieb:

    Ist doch eigentlich ganz einfach: du mußt natürlich Lowlevel anfangen, bevor du die öffentliche API entwickelst. D.h. du mußt erstmal Funktionen schreiben, um eine Pixel zu zeichnen. Dann machst du eine Funktion die mit Pixeln eine Linie zeichnet. Dann machst du eine Funktion die aus Linien ein Rechteck zeichnet... usw. usf. irgendwann kannst du du eine Funktion die viellichet heißt drawWindow() eine Fenster zeichnen.

    Irgendwann hast du soviele Lowlevel-Funktionen, das du Anwender Highlevel-Funktionen anbieten kannst. Hilevel-Funktionen (also die Win32-API) ruft am Ende nur viele Lowlevel-Funktionen auf (vielleicht auch andere Hilevel-Funktionen).

    Wie zeichnet man einen Pixel? Dazu muß man ja wissen, wie man Grafikprogrammierung macht. Und dazu muß man halt wissen, wie ein Grafikchip arbeitet. Auf einem C64 hat man einfach in einen bestimmten Speicherbereich Byte-Werte gesetzt. Das kann man heute auch mit C machen, einfach einen Pointer nehmen und nen Wert setzen... dann müsste sich auf dem Bildschirm ein Pixel in der Farbe ändern.
    Heute muß man den Grafikkartentreiber fragen, weil PCs unterschiedliche Chips haben.

    Das wäre aber unendlich ineffizient.


Anmelden zum Antworten