GUI als DLL



  • Hi,

    ich habe eine SDI-Anwendung erstellt und die Funktionalität darin implementiert. Nun möchte ich, dass ich keine EXE, sondern eine DLL als Resultat erhalte. Wie kann ich das bewerkstelligen?

    Lg Kerberos


  • Mod

    Mit welchem Sinn bitte?

    - Eine SDI Applikation ist so genaut, dass Sie immer das primäre Fenster einer Applikation ist.
    - Wer soll bitte die Nachrichtenschleife für Deine Anwednung ausführen?
    - Wie soll der Aufruf erfolgen? Wird dann das Fenster gestartet? Wan wird das Fenster zerstört?

    Zuviele Fragen, die offen sind ohne Deine Anwednung/Absicht zu kennen.



  • Hi Martin,

    vielen Dank für deine Antwort!

    Also meine Gui soll kein Teil einer Anwendung werden, sondern schon ein eigenständiges Programm, die von einem Anwendungspool aus gestartet werden kann.

    Ich brauche folgende Möglichkeiten:

    - Die Anwendung zu initialisieren
    - Das Fenster anzuzeigen
    - Und die Anwendung wieder aufzuräumen

    Ist das Möglich, bzw. wie muss ich dazu vorgehen?

    Danke und LG
    Kerberos



  • Hi,

    hat niemand einen Tipp für mich?

    Ich habe jetzt folgendes versucht:

    Die Instanz einer MFC-GUI-Applikation wird durch "MyApp theApp" in der "MyApp.cpp" erzeugt.

    Also hab ich mir gedacht, dass ich einfach die Instanzierung exportiere:

    extern "C" __declspec(dllexport) void Start()
    {
      MyApp theApp;
    }
    

    Das ganze importiere ich nun einer EXE.

    extern "C" __declspec(dllimport)void Start();
    

    und starte es.

    Start();
    

    Dadurch erhalte ich eine Assert, also kann ich das so nicht machen. Aber eine Alternative habe nicht, ich muss ja das Objekt MyApp erzeugen.

    Wie kann ich das implementieren?

    Lg Kerberos


  • Mod

    Wohinein soll den das Fenster angezeigt werden? In ein bestehendes Frame oder als Modale Anwendung?

    Wenn das ganze modal erfolgen soll, dann ist es weitaus einfacher es als eigenständigen Prozess zu belassen und einfach das Start-Fenster zu disablen und auf Deinen Prozess zu warten (dabei sicherlich noch die Windows-Nachrichten abfangen)....

    Soll das ganze nicht Modal erfolgen?
    Dann wird es einfach wenn die bestehende Applikation ein MFC Programm ist. Einfach den View und das Doc in die andere Software integrieren. Zur Not als Extension DLL, was ich aber nicht sehe.

    Ist das keine MFC Anwednung sehe ich sehr wenig Chancen einer Integration. Da Du die Ganze Anwendung auf SDI aufgebaut hast. Woher soll denn jetzt das Button Handling und das Toolbar Handling erfolgen. Deine bestehende Applikation hat ja auch bereits eines.

    Zuwenig Infos um Dir helfen zu können!



  • Hi Martin!

    vielen Dank für deine schnelle Antwort!

    Meine Anwendung soll als modales Fenster unabhängig von einem anderen Fenster angezeigt werden.

    Meine DLL soll drei Funktionen exportieren

    - Initialisierung
    - Anzeige
    - Aufräumen und Beenden

    Die andere Anwendung (EXE) ist in C geschrieben und soll lediglich der Initialisierung eine ID übergeben und diese Aufrufen, die GUI modal anzeigen und ggf. aufräumen und beenden.

    Aber leider habe ich keine Idee, wie ich das implementieren kann, wenn die Instanzierung des MyApp-Objekts aus dem obigen Beispiel nicht funktioniert, wie dann?

    Vielen Dank und Lg
    Kerberos


  • 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