CWinApp in einem neuen Thread starten



  • Hi,

    ich schreibe gerade eine Standard-DLL (ohne COM), die von einer anderen Anwendung (mit GUI) geladen wird. Nun habe ich in der dll eine SDI Applikation erstellt (Basisklasse: CWinApp), die beim Aufruf einer exportierten Funktion angelegt wird.

    Soweit so gut - meine SDI-Applikation erscheint. Das dumme ist nur, dass sie keine Messages empfängt, die kommen alle bei der Hauptanwendung an. Wenn ich z.B. Strg+P in meiner Anwendung drücke, erscheint in der Hauptanwendung der Druckdialog. Irgendwo logisch, da eine Windows-Message-Queue nur für einen Thread gilt. Allerdings sollte meine Anwendung doch einen eigenen Thread haben, da sie indirekt von CThread abgeleitet ist???

    Ich habe auch versucht mit AfxBeginThread(RUNTIME_CLASS(CMyApp)) einen neuen Thread zu erzeugen, da tauchen dann aber im AfxBeginThread einige ASSERTS auf ....

    Kann mir da jemand weiterhelfen?

    Grüße,
    Stefan



  • Hmmm sorry kann die leider nicht helfen, aber ich muss genau das machen was du grade gemacht hast (SDI in DLL), hab aber meine Probleme mein Dokument zu erstellen. Ich hatte es jetzt so gelöst das ich in der EXE ein Dokument anlege und den DC an meine DLL übergebe. Das ruft aber andere Probleme hervor. Könntest du mir evtl. mal kurz deinen Aufruf zeigen?
    Danke schonmal im voraus.



  • Hmmm Mist hab den entscheidenen Unterschied übersehen: Hab keine dll sondern ne lib. Weisst du evtl. ob das dort genauso geht? Ich versuch grade was darüber zu finden, aber das scheint zu speziell zu sein. Ansonsten muss ich das wohl zu ner dll umbauen.



  • Hi, na immerhin einer antwortet 🙂 Ich habe das Problem, dass meine DLL von einer anderen DLL dynamisch geladen wird und die Exe also nur über einige Umwege erreichbar ist. In die Exe kann/will ich nix implementieren.

    Ob das mit ner lib genauso geht, wie mit ner Dll weiß ich nicht genau, aber ich vermute schon ... Also bei mir gibt es eine von CWinApp abgeleitete Klasse in der dll, was ich etwas seltsam finde, denn die dll ist ja inproc und hat keinen eigenen Thread. Auch die CWinThread::Run - loop wird nicht durchlaufen. Klar, denn es gibt nur einen Thread und einen Prozess und es wird die Loop in der Exe durchlaufen. Wieso gibt es denn dann eine CWinApp in der DLL? Seltsam ...

    Naja, damit kann ich das SDI-Fenster hochziehen, aber OnIdle wird nicht durchlaufen und die Statusbar kriegt nicht mit, wenn man die NUM-Taste drückt. Andere ON_UPDATE_COMMMAND_UI's kommen auch nicht an.

    Ich hab einfach eine neue leere SDI-Anwendung erstellt und die Klassen in der DLL eingefügt und die von CWinApp abgeleitete Klasse angepasst.



  • Hmmm, ich glaube mit meiner Lib gehts erstmal nicht so, daher bleibe ich erstmal dabei selber mir das Document in der exe zu erstellen und es dann mit Daten aus der lib zu füllen. Dabei kann ich auch problemlos alle Messages die vom Fenster kommen abfangen und darauf in der dll reagieren. Vielleicht hilft dir das ja weiter, ansonsten hab ich zu Threads folgendes in der MSDN gefunden. Bei einer dll sollte es so funktionieren, konnte es aber halt selber nicht ausprobieren. Viel Erfolg noch.



  • gleiches Problem wie Stefan, weiss den immer noch keiner Rat? Gibts denn keine Möglichkeit die CWinApp von natur aus gleich in nem anderen Thread starten zu lassen.

    Irgendjemand meinte es gibt eine Möglichkeit, in dem man statt von CwinApp von was anderem ableitet ..... tja nur von was 😕


Log in to reply