GUI als DLL


  • Mod

    Dann greif doch auf meine Anregung zurück.

    1. Neuen Prozess starten (Deine SDI Anwendung)
    2. Wenn gestartet eigenes Main Window disablen.
    3. Schleife die weiterhin eine Message Lopp ausführt und endet wenn SDI Programm geschlossen wird
    4. Main Window wieder enablen.

    Alles andere ist Quark und von hinten durch die Brust ins Auge.



  • Hi Martin,

    Und nochmals vielen Dank für deine Hilfe,

    1. Neuen Prozess starten (Deine SDI Anwendung)

    Das hab ich ja versucht:

    MyApp theApp;
    

    Geht ja nicht und ich weiß nicht wie den Prozess / Anwendung sonst starten und anzeigen soll? Ich muss doch eine Instanz dieses Objekts erstellen, und dabei stürzt die Anwendung ab!?

    ...und von hinten durch die Brust ins Auge.

    😃 😃

    Danke
    Lg Kerberos



  • An dieser Stelle stürzt die Anwendung ab:

    ASSERT(AfxGetThread() == NULL);
    

    in der Methode

    CWinApp::CWinApp(LPCTSTR lpszAppName)
    

    Lg


  • Mod

    Neuer Prozess starten == CreateProcess bzw. ShellExecute!

    Du hast damit eine zweite EXE und keine DLL.

    Die ganzen Internas einer EXE und einer DLL beißen sich so stark, dass man nicht einfach ein EXE Projekt in eine DLL umwandeln kann.
    Alleine dass InitInstnacve durch DLLMain aufgrufen wird bedeutet, dass Du allesentzerren und selber neu bauen musst.



  • Hi Martin!

    Tut mir leid, aber ich kapier das nicht ganz.

    Ich hab mir die Beschreibung zu CreateProcess und ShellExecute durchgelesen. Wenn ich das richtig verstanden habe, dann startet man damit eine Anwendung (exe)

    Du hast damit eine zweite EXE und keine DLL
    

    Meinst du damit, dass ich eine DLL baue, die mir einfach meine Anwendung (exe)startet?

    Vielleicht könntest du mir einfach einen Beispielcode für die von dir genannten Schritte posten.

    1. Neuen Prozess starten (Deine SDI Anwendung)
    2. Wenn gestartet eigenes Main Window disablen.
    3. Schleife die weiterhin eine Message Lopp ausführt und endet wenn SDI Programm geschlossen wird
    4. Main Window wieder enablen.

    Ich hab jetzt echt zweit Tage versucht das Problem zu lösen, und scheitere schon daran etwas zu diesem Thema im Internet finden.

    Also nochmals vielen Dank!!

    Viele Grüße
    Kerberos



  • kerberos schrieb:

    Meinst du damit, dass ich eine DLL baue, die mir einfach meine Anwendung (exe)startet?

    Nein, eine Anwendung (exe), die eine andere Anwendung (exe) startet...



  • Hi!

    hmmm, und für was ist dann das mit der MessageLoop und dem Window Disable / Enable notwendig? Wenn ich die Anwendung (exe) starte, dann brauch ich dass doch nicht?

    Die gesamte GUI als DLL kann ich dann wohl vergessen?

    Danke!
    Viele Grüße Kerberos


  • Mod

    kerberos schrieb:

    hmmm, und für was ist dann das mit der MessageLoop und dem Window Disable / Enable notwendig? Wenn ich die Anwendung (exe) starte, dann brauch ich dass doch nicht?

    Du willst das doch Modal! Oder? So hast Du es geschrieben.
    1. D.h. der Benutzer soll nicht weiter n der anderen Anwendung arbeiten können. Dafür ist das EnableWindow nötig.
    2. Wenn Du nur mit WaitForSingleObject auf den Prozess wartet, dann zeichnet sich die Anwendung nicht neu und in der Caption steht schnell "Anwendung reagiert nicht". Deshlab auch weiter eine MessageLoop, die erst beendet wird, wenn der zweite Prozess terminiert.

    kerberos schrieb:

    Die gesamte GUI als DLL kann ich dann wohl vergessen?

    Naja. Es bedarf einiger tiefer Eingriffe in die Klassen, damit aus einer CWinApp EXE eine DLL wird. InitInstance/ExitInstance sind hier nur ein Teil der Probleme...



  • Hi,

    also nochmals vielen Dank!

    Jetzt hab ich das auch verstanden, wie Du das gemeint hast... Auch wenns lang gebraucht hat :D. Ich dachte du meinst mit dem eigenen MainWindow das Fenster der DLL und nicht das Fenster der EXE die die Anwendung startet.

    Lg Kerberos



  • Hallo,

    bei der Lösung meines aktuellen Problems bin ich auf diesen Thread gestoßen. Allerdings ist mein Thema - fürchte ich - ein klein wenig komplizierter.
    Ich habe die Aufgabe, eine Bibliothek (DLL) zu schreiben, welche ein GUI-Fenster erzeugt über welches dann (logisch ;)) Daten mit dem Benutzer ausgetauscht werden. Diese Daten werden dann über API an das zugrundeliegende Programm kommuniziert. Die Schnittstelle der API soll aus C-Funktionen bestehen ("regular DLL"), kann intern aber natürlich C++ verwenden.
    Das ganze soll vom zugrundeliegenden Programm mehrfach aufgerufen werden können, so dass dann mehrere Fenster zur Eingabe geöffnet werden.
    Das ist zwar ein bisschen so, als würde man NotePad mehrfach von einem Programm aus starten, aber das Interface soll eben komplett als C-API aufgebaut sein.
    Dazu kommt, dass die Vorlage für diese Lösung ein MFC-Programm ist, wovon ich gern so viel Code wie irgend möglich wiederverwenden würde.
    Bis jetzt hab ich mir an dem Problem ziemlich den Kopf angeschlagen und wollte deswegen jetzt gern mal einen Experten um Rat fragen.

    Vielen Dank im Voraus!!!
    Gruß,
    Pelle.


Anmelden zum Antworten