Pseudo-WinAPI für Linux?



  • Hallo,
    ich hab mir die Frage gestellt: Gibt es eigentlich ein Framework für Linux, das die gleichen Funktionsnamen benutzt wie die WinAPI, so dass man eine Windows-Anwendung unter Linux kompilieren kann?
    Ich meine jetzt aber nicht sowas wie Wine, das ja versucht, echte Windows-Anwendungen unter Linux zum Laufen zu bringen, sondern ein simples Pseudo-WinAPI-Framework, wo die windows.h nachprogrammiert ist, während in den Funktionsdefinitionen ein natives Linux-Framework verwendet wird und einfach die Funktionen aufruft, die dann das machen, was die Windows-Funktion machen würde. Also ungefähr so (das hier gezeigte Linux-Framework ist fiktiv):

    In der "windows.h:"

    #include <linuxframework.h>
    
    typedef LinuxWindow *HWND;
    
    int MessageBox (HWND hWnd, LPCSTR lpszText, LPCSTR lpszCaption, UINT uType);
    

    In der entsprechenden CPP-Datei:

    #include "windows.h"
    
    int MessageBox (HWND hWnd, LPCSTR lpszText, LPCSTR lpszCaption, UINT uType)
    {
        if (hWnd)
            return hWnd->ShowMB (lpszText, lpszCaption, uType==MB_OK?LinuxWindow::OK_BUTTON:uType==MB_OKCANCEL?LinuxWindow::OK_BUTTON|LinuxWindow::CANCEL_BUTTON:...);
        else
            return 0;
    }
    


  • nein gibts nicht. Die WinAPI ist viel zu gross und umfangreich und Windows-spezifisch, um sie auf Linux nachzubauen.



  • Nimm doch einfach ein Cross-GUI-Lib wie WxWidget,(QT oder andere):

    int answer = wxMessageBox("Quit program?", "Confirm",
                                wxYES_NO | wxCANCEL, main_frame);
    

    Blue-Tiger schrieb:

    nein gibts nicht. Die WinAPI ist viel zu gross und umfangreich und Windows-spezifisch, um sie auf Linux nachzubauen.

    Ausserdem hatte MS was dagegen, schon schlimm genug das es Mono gibst. 😃



  • Jason E. schrieb:

    Ich meine jetzt aber nicht sowas wie Wine, das ja versucht, echte Windows-Anwendungen unter Linux zum Laufen zu bringen, sondern ein simples Pseudo-WinAPI-Framework, wo die windows.h nachprogrammiert ist, während in den Funktionsdefinitionen ein natives Linux-Framework verwendet wird und einfach die Funktionen aufruft, die dann das machen, was die Windows-Funktion machen würde.

    Ähm, ich sag's mal so: Wine "consists of a program loader, which loads and executes a Windows binary, and a set of libraries that implements Windows API calls using their UNIX or X11 equivalents. The libraries may also be used for porting Win32 code into native UNIX executables, often without many changes in the source." ...



  • Nimm doch einfach ein Cross-GUI-Lib wie WxWidget,(QT oder andere)

    Darum ging es mir nicht. Es ging mir darum, bereits bestehende Programme (inklusiver beliebiger WinAPI-Wrapper oder zusätzlicher Frameworks, die auf die WinAPI aufbauen) in Linux kompilieren zu können, nicht darum, ein zukünftiges Programm daraufhin zu planen.

    The libraries may also be used for porting Win32 code into native UNIX executables, often without many changes in the source.
    

    Was bedeutet "often without many changes"? Dass ich oft wenige Änderungen habe, selten viele und niemals gar keine? 😃



  • Jason E. schrieb:

    Nimm doch einfach ein Cross-GUI-Lib wie WxWidget,(QT oder andere)

    Darum ging es mir nicht. Es ging mir darum, bereits bestehende Programme (inklusiver beliebiger WinAPI-Wrapper oder zusätzlicher Frameworks, die auf die WinAPI aufbauen) in Linux kompilieren zu können, nicht darum, ein zukünftiges Programm daraufhin zu planen.

    Dann lass dir gesagt sein, dass es nicht geht 🙂



  • Jason E. schrieb:

    The libraries may also be used for porting Win32 code into native UNIX executables, often without many changes in the source.

    Was bedeutet "often without many changes"? Dass ich oft wenige Änderungen habe, selten viele und niemals gar keine? 😃

    So ungefähr, ja.

    Mit der winelib kannst Du Programme leichter portieren, nicht einfach 1:1 von Windows nach GNU/Linux übernehmen. Aber was hast Du Dir erwartet? Die WinAPI ist kein offener Standard, den man einfach schnell mal vollständig reimplementieren könnte.



  • Und die winelib ist mies (gar nicht?) dokumentiert. Kaum einer benutzt die, wenn du Fehler findest bist du wahrscheinlich mit selbigen alleine auf weiter Flur...



  • Programmiert echt noch jemand direkt WinAPI?

    Ich habe kurz versucht mir selbst ein Wrapper um die WinAPI zu schreiben, so als Spassprojekt, aber wer benutzt schon freiwilig die WinAPI direkt? Ich hab das noch nie gemacht...



  • DEvent schrieb:

    ...wer benutzt schon freiwilig die WinAPI direkt?

    Leute, die Funktionalitäten brauchen, die die Macher des Frameworks nicht als wichtig genug ansahen, um sie zu kapseln?

    Gut, dann kann man vielleicht die Freiwilligkeit in Frage stellen, aber Fakt ist nunmal, die WinAPI ist bis jetzt die vielseitigste (und leistungsfähigste) Schnittstelle zum Entwickeln von Windowsprogrammen.



  • DEvent schrieb:

    Programmiert echt noch jemand direkt WinAPI?

    Ja, Leute die kleine Programme schreiben wollen (klein im Sinn von kleines Executable).



  • Mit der winelib kannst Du Programme leichter portieren, nicht einfach 1:1 von Windows nach GNU/Linux übernehmen. Aber was hast Du Dir erwartet? Die WinAPI ist kein offener Standard, den man einfach schnell mal vollständig reimplementieren könnte.

    Naja, Wine wurde ja auch entwickelt. Und hier müßte man ja einfach nur ein gutes Linux-Framework nehmen und dann in den Windows-Funktionen die entsprechenden Linux-Funktionen aufrufen. Im Vergleich zu Wine, wo die gesamte Windows-Architektur so nachgebaut wurde, dass ein echtes Windows-Programm in Linux funktioniert, dürfte dieses Vorhaben ja vergleichsweise einfach sein.

    Programmiert echt noch jemand direkt WinAPI?

    Ich habe kurz versucht mir selbst ein Wrapper um die WinAPI zu schreiben, so als Spassprojekt, aber wer benutzt schon freiwilig die WinAPI direkt? Ich hab das noch nie gemacht...

    Wenn es das, was ich mir da vorgestellt habe, gegeben hätte, könnte man damit ja im Prinzip auch alle anderen Frameworks benutzen, die auf der WinAPI basieren: Das Framework ruft die WinAPI-Funktionen auf, welche unter Linux und der Pseudo-WinAPI die Funktionen eines anderen Frameworks aufrufen.



  • Jason E. schrieb:

    Mit der winelib kannst Du Programme leichter portieren, nicht einfach 1:1 von Windows nach GNU/Linux übernehmen. Aber was hast Du Dir erwartet? Die WinAPI ist kein offener Standard, den man einfach schnell mal vollständig reimplementieren könnte.

    Naja, Wine wurde ja auch entwickelt. Und hier müßte man ja einfach nur ein gutes Linux-Framework nehmen und dann in den Windows-Funktionen die entsprechenden Linux-Funktionen aufrufen. Im Vergleich zu Wine, wo die gesamte Windows-Architektur so nachgebaut wurde, dass ein echtes Windows-Programm in Linux funktioniert, dürfte dieses Vorhaben ja vergleichsweise einfach sein.

    Du stellst dir dass viel zu einfach vor. Es gibt unter Linux eben _nicht_ die gleichen Funktionen wie die der WinAPI, nur das die nicht WinAPISomething() sondern LinuxSomething() heißen! Selbst wenn man ähnliche Funktionen hat, verhalten die sich vielleicht in unterschiedlichen Situationen komplett anders und schon funktionieren vielleicht 3 von 10 Anwendungen nicht mehr. Wenn man dann noch kaum oder schlecht dokumentierte WinAPI Funktionen einbezieht, dann ist es ohnehin vorbei.

    Wer auf WinAPI setzt muss eben einsehen, das er nur für eine Plattform Anwendungen schreibt und sich so an Microsoft bindet. Wenn du dir aber selbst wrapper geschrieben hast, dann portiere doch einfach dein Framework, anstelle so ein gefrickel zu veranstalten.


Log in to reply