sauber plattformübregreifend programmieren



  • Hi,

    ich bin ziemlich neu auf dem Gebiet der Windowsprogrammierung, möchte mich aber gern weiter damit beschäftigen. Um einen Einstieg zu finden habe ich mich erstmal mit der WinAPI beschäftigt, habe das Prinzip der Nachrichten, etc. auch einigermaßen verstanden, denke ich. Zur weiteren Vertiefung habe ich angefangen einen kleinen API-Wrapper zu schreiben, der kann noch nicht viel, aber man braucht keine 20 Zeilen mehr, um ein simples Fenster zu erstellen. 🙂
    Jetzt tu ich mich aber schwer weiter daran zu arbeiten, wenn ich genau weiß, dass das Programm hinterher nur unter Windows laufen wird, deswegen habe ich mich schlau gemacht, was es da so gibt und bin auf wxWidgets und QT gestoßen. Mein Problem bei QT ist die Lizensierung und bei wxWidgets habe ich schon mehrfach gelesen, dass es ziemlich "unsauber" programmiert sein soll (sehr viele Macros, etc.).

    Meine Frage daher:
    Gibt es einen sauberen Weg plattformübergreifend zu programmieren und das nach Möglichkeit auch noch ohne irgendwelche Lizenzbestimmungen?
    Bzw. Gibt es unter Linux(Mac) ebenfalls ein API, ähnlich der WinAPI, die man dann auch kapseln könnte, damit man sich so eine eigene Bibliothek "bauen" kann, wo man dann auch weiß, was wo passiert oder führt der einzige Weg über wxWidgets, QT und Konsorten?

    Eine andere Frage wäre:
    Womit werden Firefox, OpenOffice, etc. programmiert, verwenden die alle wxWidgets oder QT?

    Vielen Dank schonmal für die Antworten und habt etwas Nachsicht, falls das alles schon mehrfach diskutiert wurde, aber bisher konnte ich nichts für mich zufriedenstellendes finden. 😞

    // Edit:
    Noch ne Frage: 🙂
    Wie sieht es unter Linux mit wine aus, kann man davon ausgehen, dass, wenn man mit der WinAPI entwickelt, dass wine damit dann auch klar kommt, oder gibt es da Dinge, die man beachten sollte? Und gibt es so einen Emulator auch für Mac?
    Das würde mich auch erstmal zufriedenstellen, wenn ich wüsste, dass reine WinAPI-Programme zumindest per Emulator unter Linux/Mac laufen. Hat da jmd von euch Erfahrung mit?
    // ---

    mfg
    mantiz



  • Gibt es einen sauberen Weg plattformübergreifend zu programmieren und das nach Möglichkeit auch noch ohne irgendwelche Lizenzbestimmungen?

    Nimm Java :). Nee, mal im ernst: mit C, bzw C++ bist du am besten bedient, wenn du Deine Anwendungslogik komplett von Deinem GUI - Code trennst. Schau dazu mal nach Stichworten wie MVC und Doc/View. Ich bin nach wie vor der Meinung, das das eher eine Frage eines guten Anwendungsdesigns, als des verwendeten Toolkits ist. Der Preis für Plattfromunabhängigkeit sollte nicht zur totalen Abhängigkeit von einem bestimmten Toolkit führen.

    Du kannst ja mal bei Codeproject.com schauen. Dort sind auch einige Artikel darüber. Unter anderem http://www.codeproject.com/useritems/Reversi.asp
    Das ist ein Reversi Port, sowohl für MFC, Konsole QT, wxWindows und SDL. Da habe ich seinerzeit ein bisschen mit den ganze Bibliotheken herumprobiert.

    Du solltest auch darauf achten, nicht irgendwelche Systemabhängigen Variablentypen zu verwenden. Wer einmal eine Anwendung portiert hat, wo haufenweise BOOL, DWORD und Co. verwendet wurden weis, was ich meine :).

    Zum Thema Wine: Schön wenn es geht (Ich staune selber immer), aber ich würde mich nicht darauf verlassen. Für Mac giebt (/gab) es auch sowas - bin da seit neuestem nicht mehr so ganz auf dem laufenden. Das hat seinerzeit unter dem ollen Mac OS auch ziemlich gut funktioniert.



  • TheBigW schrieb:

    Du solltest auch darauf achten, nicht irgendwelche Systemabhängigen Variablentypen zu verwenden. Wer einmal eine Anwendung portiert hat, wo haufenweise BOOL, DWORD und Co. verwendet wurden weis, was ich meine :).

    Ein paar Typedefs ändern, und?



  • Ein paar Typedefs ändern, und?

    Nicht ganz schön, oder? Das führt dann zu solch häßlichen Präprozessorschlachten, die IMO nicht sein müssen:

    #ifndef DWORD
       #define DWORD unsigned long
    

    Es geht ja weiter, mit Sachen wie RECT, POINT u.s.w. klar kann man das machen, schön ist es deswegen noch lange nicht. Wenn man dabei ist was komplett neues anzufangen, kann man sich sowas sparen.



  • OK, soweit ganz einleuchtend. 🙂
    Das würde für mich bedeuten, dass ich z.B. eine Klasse schreibe, um ein Fenster anzuzeigen z.B. mit einer Methode dieses in der Größe zu verändern. Dafür habe ich in der WinAPI ein Fenster-Handle und die API-Funktionen, zusätzlich eine Nachrichtenschleife, die die Nachrichten an die per RegisterClass angegebene Windowproc weiterleitet. Dort kann ich dann eine Funktion OnSize(...) der Instanz aufrufen, etc.
    Läuft das unter Linux genauso ab?
    Also von wegen Fensterklasse registrieren, Nachrichten kommen in Windowproc an und dort werden sie ausgewertet?
    Bzw. kann ich mich irgendwo schlau machen, wie ich unter Linux z.B. ein Fenster erstelle mit nem Button, wo dann eine Msg-Box kommt, die ich bestätigen muss/kann und das ohne Toolkit, damit ich mir ein Bild machen kann, wie die ganze Sache unter Linux läuft?
    Ich denke mal, dass es irgendwie ähnlich ablaufen muss, aber ich weiß es halt nicht. 😞
    Dann hätte ich zumindest einen Ansatzpunkt, was alles in den Wrapper muss. Bisher habe ich die Nachrichtenschleife z.B. nicht mit drin.

    Was die Typdefinitionen angeht, das ist klar. Ich habe auch schon angefangen, dass ich nach Möglichkeit nur mit strings arbeite, damit die ganzen char-cast wegfallen, die gehen mir nämlich auch schon so ziemlich auf den Sack. 🙂

    @Walli: Genau deswegen habe ich ja auch davon gelesen, dass wxWidgets nicht(/nicht mehr) so sauber sein soll, weil der Code voll mit irgendwelchen Präprozessor-Anweisungen, etc. sein soll.



  • Wenn ich das so lese denke ich es ist besser, wenn du einfach einmal mit den verschiedenen Toolkits rumspielst, um die Gemeinsamkeiten zu sehen. Die Frage, ob das unter Linux so abläuft ist so eigentlich falsch.
    Richtig ist, das die Funktionalität und Eigenschaften die ein Fenster hat wohl immer irgendwie ähnlich sind. Das Messagehandling ist in jedem Toolkit ein bisschen anders - häßlicher als in der WinAPI allerdings nirgends :).



  • TheBigW schrieb:

    Ein paar Typedefs ändern, und?

    Nicht ganz schön, oder? Das führt dann zu solch häßlichen Präprozessorschlachten, die IMO nicht sein müssen:

    #ifndef DWORD
       #define DWORD unsigned long
    

    Es geht ja weiter, mit Sachen wie RECT, POINT u.s.w. klar kann man das machen, schön ist es deswegen noch lange nicht.

    Stimmt, aber dann mache ich lieber sowas als ewig in dem alten Code rumzuändern bis es passt.

    TheBigW schrieb:

    Wenn man dabei ist was komplett neues anzufangen, kann man sich sowas sparen.

    Natürlich, das ist immer der beste Weg. Wenn man doch einmal ein Dword braucht, dann setzt man sich halt selber ein typedef, welches man je nach Plattform anpassen muss.



  • So, jetzt hab' ich mich dumm und dämlich gegoogelt. 🙂

    Wie es aussieht ist die xtlib ähnlich wrap-bar, wie die WinAPI, läuft zwar grundsätzlich etwas anders ab, aber es müsste sich ein einheitlicher Wrapper erstellen lassen, zumindest, was die Std-Controls angeht. QT soll auch auf die xtlib aufbauen. Mal sehen, ob ich zumindest ein Fenster hinbekomme. 🙂

    Ich danke euch auf jeden Fall schonmal für die Tips und Links, das hat mir schon sehr geholfen.



  • Natürlich haben andere Betriebssysteme auch Programmierschnitstellen. Wie sollte man sie sonst programmieren? 🙄 Auf Wine zusetzen um die WinAPI unter Linux zu benutzen ist nicht gut. Vorallem da die WinAPI ja nicht mehr lange unter Windows existieren wird. Und ehrlich die WinAPI ist nicht gerade die tollste API. WinAPI und wxWidgets gibt sich nicht viel.



  • Hi!
    Ja, die grafischen Oberflaechen unter Linux laufen alle auf dem "X Server". Mit diesem Server wird ueber ein eigenes Protokoll kommuniziert. Die xlib bietet dir Zugriff auf dieses Protokoll (zumindest ist das mein Wissensstand). Die Xlib soll allerdings sehr, sehr kompliziert und haesslich sein.
    Zudem ists wohl sehr umstaendlich, fuer jedes System selbst einen Wrapper zu schreiben. Zugegeben sicher sehr lehrreich, aber umstaendlich.

    als "gut designed" gelten allgemein Qt, VCF und gtkmm. Mit Qt hast du momentan noch Lizenzprobleme. Wenn du sowieso Open Source Software schreibst weniger ein Problem. Ab Qt 4 wird auch die Windows-Version unter der GPL stehen, d.h. du kannst damit unter Linux und Windows problemlos schreiben (ob Qt auch Macs unterstuetzt weiss ich nicht).

    VCF kenn ich nur vom Hoerensagen. Gibt aber AFAIK keine brauchbare Linux-Implementation.

    gtkmm ist das Toolkit, dass der GNOME-Desktop unter Linux verwendet. D.h. es ist zusammen mit Qt das am meisten eingesetzte Toolkit unter Linux (z. B. greift auch wxWidgets in Linux auf Gtk zurueck). Allerdings hast du mit gtkmm unter Windows das gleiche Problem wie mit WINE-Emulation unter Linux: es sieht ungewohnt aus.
    Aus dem Grund rate ich dir auch ab, dich nicht auf WINE zu verlassen: ein Windows-Programm, dass ueber WINE auf Linux laeuft sieht aus & verhaelt sich wie.... na ja, wie ein Windows-Programm, ganz untypisch. Und umgekehrt eben auch: ein gtkmm Programm unter Windows sieht auch so "anders" und "seltsam" aus, weil es sich eben von "normalen" Windows-Programmen unterscheidet. (selbe Problematik gibts uebrigens auch bei anderen weniger bekannten Toolkits, z. B. FOX... Qt und wxWidgets haben das Problem nicht).

    Du kannst auch in wxWidgets "sauber" programmieren. Wichtig ist wie schon oben erwaehnt nur, dass du GUI-Code moeglichst vom echten Applikationscode getrennt haellst, dann kannst du zur Not immer noch Toolkit wechseln 🙂

    just my 2 cents, vielleicht hilfts dir weiter.

    Uebrigens gibts in der FAQ eine gute Uebersicht ueber die verschiedenen Toolkits und deren Vor- und Nachteile.


Anmelden zum Antworten