grabherp: Schnittstelle zu C Programm

Hi

Folgende Problemstellung: Wir haben ein Softwareprojekt in C++ fuer Windows erstellt. Unser Wunsch ist nun dieses plattformunabhaengig zu machen. Das GUI soll nun als HTML Seite realisiert werden und bei klicken eines Buttons soll die entsprechende Methode im C++ Programm abgearbeitet werden. CGI erlaubt C/C++ Programm aufzurufen. Ist es hier aber irgendwie auch moeglich eine Funktion von einem laufenden C++ Programm aufzurufen? Um ehrlich zu sein habe ich keinen Plan wie ich dieses Problem angehen koennte und waere daher fuer jeden hilfreichen Tip sehr dankbar!

Gruss
Philipp

  1. Moin!

    Folgende Problemstellung: Wir haben ein Softwareprojekt in C++ fuer Windows erstellt.

    Das bedeutet, dass das Programm gestartet wird und dann dauerhaft läuft, und zur Entgegennahme von Userinteraktivität hängt es in einer Warteschleife und wartet dort auf "Messages" - das ist aber alles in den grundsätzlichen Bibliotheken bereits realisiert, üblicherweise programmiert man doch nur den Code, der als Reaktion auf eine festgestellte Useraktion ausgeführt werden soll, und kümmert sich nicht um den Rest.

    Unser Wunsch ist nun dieses plattformunabhaengig zu machen.

    Nimm Java statt C++. :)

    Das GUI soll nun als HTML Seite realisiert werden und bei klicken eines Buttons soll die entsprechende Methode im C++ Programm abgearbeitet werden. CGI erlaubt C/C++ Programm aufzurufen.

    Wenn du HTML einsetzen willst, mußt du einen Browser einsetzen. Wenn du CGI einsetzen willst, mußt du zwingend auch einen Server einsetzen. Server sind aber im Allgemeinen nicht auf Clientrechnern installiert - und sie sollten es auch nicht sein, wenn es keine zwingenden Gründe dafür gibt. Also wird wahrscheinlich ein zentraler Server benötigt.

    Dieser zentrale Server wird dann aber parallel mehr als einen Benutzer des Programms versorgen, es handelt sich dann nicht mehr um eine Single-User-Applikation. Allein dieser Schritt kann schon eine sehr gewichtige Umstellung bedeuten. Ist dein Programm dazu fähig?

    Zweitens: Die Benutzerinteraktion findet zwingend mittels HTTP statt. Es bedeutet aber, dass dein C++-Programm nicht mehr durchgehend läuft, sondern es wird von jedem HTTP-Request ein CGI-Aufruf des Programms neu angestoßen, welcher dann alle möglichen Variablen, Objekte etc. neu erstellen (oder aus irgendeinem Speicher holen) muss, festzustellen hat, wo im Ablauf sich der Benutzer befindet, dazu passend eine HTML-Antwort erstellt, diese an den Browser sendet und dann wieder beendet wird.

    Es gibt natürlich die Möglichkeit, parallel zum HTTP-Server einen "Mein Programm"-Server zu starten, welcher die Datenverwaltung (für alle User parallel und getrennt) vornimmt, analog beispielsweise zu einer Datenbank, und mit dem die einzelnen CGI-Programme dann zur Erfüllung einer einzelnen Aufgabe kurz kommunizieren können.

    Insgesamt aber ist das Umarbeiten einer normalen Windows-Applikation in eine ausgereifte Client-Server-Applikation im HTTP-Kontext mit HTML-Oberfläche nichts, was man "mal eben" realisieren könnte, oder was "so nebenbei" aus der Tasche fällt.

    Das fängt ja allein schon damit an, dass echte Applikationen (hinsichtlich Benutzeraktionen) im Browser gar nicht möglich sind, sondern man gewisse Eingabehilfen mit Javascript unterstützen muß. Auch stehen nur sehr eingeschränkte Formularelemente zur Verfügung, es fehlt beispielsweise in Standard-HTML an einem Listenelement (der Art <select>), dem man eigene Einträge hinzufügen kann.

    Und obendrein haben normale Applikationen immer nur einen begrenzten Bildschirmbereich zur Verfügung, den sie ggf. entsprechend dynamisch veränderlich ausfüllen können. HTML hingegen will in seiner Urkonfiguration immer irgendwie gescrollt werden. Auch dieser fundamentale Unterschied kann nur mit zusätzlichem Aufwand angeglichen werden.

    Ist es hier aber irgendwie auch moeglich eine Funktion von einem laufenden C++ Programm aufzurufen? Um ehrlich zu sein habe ich keinen Plan wie ich dieses Problem angehen koennte und waere daher fuer jeden hilfreichen Tip sehr dankbar!

    Wie erwähnt: Du kannst auch in C++ CGI-Programme schreiben. Dazu müßtest du dann entsprechend die CGI-Schnittstelle berücksichtigen und verarbeiten, um die Informationen vom Browser, die dir der Webserver zur Verfügung stellt, korrekt zu verarbeiten, und dann auch eine korrekte Antwort zu generieren - welches immer eine vollständige HTTP-Antwort sein muß, welche in den meisten Fällen eine komplette HTML-Seite oder z.B. auch ein Bild enthält.

    Was nicht funktioniert (und genau das glaube ich, dass du hoffst erreichen zu können), ist eine Realisation nach diesem Beispiel:
    Du markierst einen Text und klickst einen Button, um den Text "fett" zu machen.

    Das Problem daran ist: Erstens kann eine normale Textarea keinen fetten Text darstellen, du brauchst also einen auf Javascript basierten WYSIWYG-Editor, welcher statt der Textarea ein Iframe nimmt. Zweitens: Dieser WYSIWYG-Editor wird zum Fetten des Textes keinerlei Server-Kommunikation betreiben, deine Applikation bekommt vom fetten Text erst etwas mit, sobald dieser nach Abschluß der Arbeiten insgesamt wieder zurückgeschickt wird.

    Auch mußt du zwingend für alles, was dein C++ derzeit so onfocus, onblur oder onkeypressed tut, in Javascript übersetzen, und eine für den konkreten Anwendungsfall vernünftige Umsetzung programmieren.

    Beispielsweise kann man nicht auf einfache Weise den Inhalt einer Select-Liste austauschen. Es gibt mittlerweile zwar Mittel und Wege, dass Javascript mittels XMLHttpRequest vom Server XML-Daten nachlädt und diese dann auswerten und dynamisch in die HTML-Seite einsetzen kann - das ist aber alles ein komplett anderer Weg und viel mehr Handarbeit, als in C++ beim Programmieren einer Windows-Applikation, bei dem existierende Methoden einem viel Arbeit abnehmen.

    - Sven Rautenberg

    1. Hi,

      Folgende Problemstellung: Wir haben ein Softwareprojekt in C++ fuer Windows erstellt.

      Nur das Projekt oder auch die Software? ;-)

      Unser Wunsch ist nun dieses plattformunabhaengig zu machen.

      Nimm Java statt C++. :)

      Das war jetzt gemein, Sven! ;->

      BTW: wenn's nicht gerade auch noch für Handys sein soll, ist die QT-Widget-Biblithek von Trolltech ebenfalls ausreichend plattformunabhängig, wenn auch nicht auf Binarieebene.

      Insgesamt aber ist das Umarbeiten einer normalen Windows-Applikation in eine ausgereifte Client-Server-Applikation im HTTP-Kontext mit HTML-Oberfläche nichts, was man "mal eben" realisieren könnte, oder was "so nebenbei" aus der Tasche fällt.

      Ja gibt's denn dafür keinen passenden Menüeintrag im Visual-Crap oder kost' das extra?

      Entschuldigt bitte meine Sarkasmus, aber ich habe gerade eben genau das erlebt. Zwar nicht das gleiche Problem, aber im Prinzip die gleiche Aufgabe: ein proprietäres single-user Programm zu einem voll plattformunabhängigem multi-user P2P-Programm (Client-Server ist ja schließlich sowas von out!) umbasteln. Der Dialog in Kürze:

      "Ich hab' da folgende $AUFGABE. Geht das?"
      "Jepp."
      "Und wie?"
      "Unter Einsatz von $VIEL_ZUVIEL_GELD und $VIEL_ZU_VIEL_ZEIT."
      "Oh?"
      "Jepp."

      Lück jibbet, ich sach Dir ... *sigh*

      so short

      Christoph Zurnieden

  2. CGI ist nur eine Schnittstelle, die den Aufruf eines Programms erlaubt. Alles, was CGI macht, kannst du auch einfach durch das Setzen entspr. Umgebungsvariablen und den Aufruf per Kommandozeile erreichen.

    Eine andere Möglichkeit wäre, ein CGI-Skript in einer Skriptsprache wie Python zu schreiben und dann eine C/C++-Funktion aufzurufen. Dafür müsste man sich dann mit dem Einbetten von C/C++ in diese Skriptsprache beschäftigen.
    Ist meist nicht weiter schwer, bei Perl ab und an etwas umständlich, bei Python eigentlich ganz nett und bei PHP habe ich keine Ahnung.

    fs