wxWidgets Dialog in DLL packen



  • Hallo,

    ich möchte gern einen wxDialog in eine DLL packen. Von einer beliebigen Anwendung aus soll dann diese Dialog aufgerufen werden können.
    Funktioniert auch ganz gut. Allerdings gibt es ein Problem:
    Sobald die Anwendung selbst wxWidgets benutzt, kommt es zu merkwürdigen Verhalten.
    Es scheint als würden dann Anwendung und DLL auf gemeinsame statische Variablen von wxWidget zugreifen.
    Gibt es eine Möglichkeit das irgendwie in den Griff zu bekommen?

    Sid


  • Mod

    Benutzt du statisch gelinktes wxWidgets?

    Ansonsten müsstest du mal in die Samples schauen, ob da was dabei ist.



  • Ich hab bei der DLL, als auch dem Testprogramm, statisches und dynamisches Linken von wxWidget probiert. Brachte leider keinen Erfolg.

    Diese Seite hab ich als Grundlage genommen.
    http://wiki.wxwidgets.org/Creating_A_DLL_Of_An_Application

    Bei den Samples bin ich nicht wirklich fündig geworden.

    (Die DLL funktioniert übrigens prima wenn ich sie zum Beispiel von einem Win32-Api-Porgramm aus lade.)



  • Funktioniert bei mir prächtig. Das Programm hat diverse DLLs die beim Programmstart geladen werden (Plugins). Die erstellen problemlos dutzende Dialoge und Frames.

    Mein WX ist als Monolithic DLL compiliert. Sämtliche DLLs (auch die WX-DLL) linken dynamisch die CRT.



  • Hallo frenki,

    benutzt dein Programm auch wxWidgets? Wenn du die DLL's lädts, wie erzeugts du dann die Frames/Dialoge? (Übergibts du ein (wx-spezifisches)Handle vom Hauptprogramm? Oder kommst du ganz ohne aus?)
    Evt. kannst du ja mal etwas Quellcode posten. Da wär ich dir sehr dankbar! 🙂



  • Ja, logisch, das Programm verwendet wx.

    Ich habe meine von wxApp abgeleitete Klasse ebenfalls in einer DLL. Diese wird einfach von den anderen DLLs mitgelinkt, so können die Plugins direkt auf das Application-Objekt zugreifen.

    In meinem Application-Objekt habe ich eine Funktion GetMainFrame(). Hierrüber können die Plugins dann das Hauptfenster rausfinden und die Dialoge modal zu diesem erstellen. Wobei die meisten Plugins nur Panels liefern, die bekommen den Parent (z.B. das Notebook in dem sie eingefügt werden) direkt geliefert.



  • Deine Plugins brauchen also eine Hauptprogramm welches auch auf wxWidget basiert.
    Ich bräuchte eine Lösung, die für beide Fälle funktioniert (Programm basiernd auf wx und "normales" Programm). Hast du da vielleicht eine Idee?



  • Wo ist da das Problem? Du kannst doch Problemlos in 'nem WX-Programm auch die WinAPI verwenden.



  • Also ich versuchs nochmal zu erklären:
    - ich möchte eine DLL in der ein Dialog von wxWidget aufgerufen werden kann
    - die "API" der DLL soll anwendungsunabhänging sein d.h. die DLL könnte auch von nem Konsolenprogramm aufgerufen werden.

    Mein Problem:
    Benutzt die Anwendung selbst wx kommt es zu Fehlern wenn ich die DLL lade. (zB.: ich kann die Anwendung nicht mehr schliessen)
    das Problem liegt wahrscheinlich darin dass 2 Instanzen von wx (Anwendung und DLL) in einem Prozess laufen!?

    Hoffe ich konnte etwas Licht in die Sache bringen 😉



  • Ah, verstehe.

    Sorry, da kann ich dir auch nicht weiterhelfen.



  • Habe auch gerade dieses Problem,
    Ich möchte in einer DLL eine wxGUI anbieten,
    diese GUI soll z.B. von einer MFC Applikation oder von einer wxApp. aus gestartet werden können.

    in der DLL wir in(DLL_PROCESS_ATTACH)ein wxAPP Objekt erzeugt und die Guis können aufgerufen werden.

    Erzeugt nun die Applikation ausserhalb ebenfalls ein App Objekt und Frames funktioniert die äussere Messageloop nicht mehr.

    Bin interessiert an Beispielen und Lösungen


  • Mod

    Die DLL darf meines Wissens kein eigenes wxAPP Objekt erzeugen.



  • Ich hab eine kleine Graphic-Engine mal auf wxWidgets aufgesetzt, weil die tollen Support für UNICODE und so haben. Die lief auch in einer DLL. Hab das dann aber neu geschrieben, weil es hier einige andere Probleme gab. Egal.

    Die Quintessenz findet Ihr in diesen Dateien:
    http://svn.origo.ethz.ch/wsvn/dieselgamedll/DieselTool/DieselTool/src/dtApp.cpp

    int argc = 0; char** argv = NULL;
        wxSetInstance(hInstance);
        wxEntryStart(argc, argv);
    

    Das ist eigentlich schon alles. Mit diesen 2 Zeilen initialisiert man die DLL. Es darf wie gesagt, kein wxApp-Objekt geben.
    Und später das wxEntryCleanup() nicht vergessen:
    http://svn.origo.ethz.ch/wsvn/dieselgamedll/DieselTool/DieselTool/src/dllmain.cpp

    HTH
    rya.

    ps.: Der Code ist scheisse und nicht representativ 😛 und der SVN wird demnächst resettet mit einem kompletten rewrite :D... also keine Flames büdde *gg*.


Anmelden zum Antworten