Announcement

Collapse
No announcement yet.

Fenster in DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Fenster in DLL

    Habe in einer DLL eine Form aufgenommen und ein Fenster erzeugt. Das Anlegen und zertören des Fensters erfolgt in DllEntryPoint:

    <pre>
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
    {
    switch (reason)
    {
    case DLL_PROCESS_ATTACH:
    myview=new TView(0);
    break;
    case DLL_THREAD_ATTACH:
    break;
    case DLL_THREAD_DETACH:
    break;
    case DLL_PROCESS_DETACH:
    delete myview;
    break;
    }
    return true;
    </pre>
    Die Anzeige des Fenster erolgt dann in einer Methode einer Klasse:
    <pre>
    void GLogFile::ShowLog()
    {
    .....
    myview->Memo1->Lines->Clear();
    myview->Memo1->Lines->LoadFromFile(fname);
    myview->Show();
    }</pre>

    Zeige ich das Fenster mit myview->ShowModal() an, funktioniert alles

    bestens. Benutze ich aber wie o.a. ->Show() kommt es bei <b>einigen</b>

    Anwendungen zu Exceptions beim Beenden der Anwendung

    (Zugriffsverletzung beim lesen von Adresse...). Vermutlich ist die DLL schon

    entladen und das aufrufende Programm will noch was tun? Der Fehler tritt

    nur beim Beenden der Anwendung auf und - weils ja Spass machen soll -

    nicht bei allen Anwendungen. Das CPU Fenster zeigt, dass die Exceptionin

    der aufrufenden Anwendung im Dispatch-Aufruf geworfen wird.

    Grafik CPU-Fenster:http://www.marquardtnet.info/cecke/links.7/bild1.jpg

    Hat jemand eine Idee, wieso warum, weshalb

    Danke

    Christian
    Christian

  • #2
    Bei Show Modal() hast Du ja auch keine andere Chance als das Fenster vorher zu schließen.
    Kann es sein das das Fenster noch auf ist und die DLL entladen wird ?
    dann probier doch mal die Fenster vorher zu schließen.

    Z.B mit
    if(myForm->Showing)
    myForm->Close()

    Comment


    • #3
      Schon probiert -> ohne Erfol
      Christian

      Comment


      • #4
        Wenn Du sagst es passiert nur manchmal, dann würde ich fast sagen, dasss ist ein Zeit-Problem bau doch bitte mal dach dem delete myview;
        ein sleep ein

        Comment


        • #5
          Habe jetzt:

          <pre>
          case DLL_PROCESS_DETACH:
          Application->MessageBox("vor Sleep","",MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL);
          Sleep(5000);
          Application->MessageBox("vor Close","",MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL);
          myview->Close();
          Application->MessageBox("vor Delete","",MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL);
          delete myview;
          Application->MessageBox("vor Sleep","",MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL);
          Sleep(5000);
          break;

          </pre>

          Zusätzlich habe ich im Formular des Fensters:

          <pre>
          void __fastcall TView::FormClose(TObject *Sender, TCloseAction &Action)
          {
          Application->MessageBox("close","",MB_OK|MB_ICONEXCLAMATION|MB _APPLMODAL);
          }
          //---------------------------------------------------------------------------

          void __fastcall TView::FormCloseQuery(TObject *Sender, bool &CanClose)
          {
          Application->MessageBox("query","",MB_OK|MB_ICONEXCLAMATION|MB _APPLMODAL);
          }
          //---------------------------------------------------------------------------

          void __fastcall TView::FormDestroy(TObject *Sender)
          {
          Application->MessageBox("destroy","",MB_OK|MB_ICONEXCLAMATION| MB_APPLMODAL);
          }
          //---------------------------------------------------------------------------

          </pre>

          Durch die Sleeps werden jetzt die Ereignisse des Formulars zumindestend teilweise ausgeführt. der Absturz erfolgt im CloseQuery des Formulars.

          Was mich aber irretiert ist, dass kein Fehler in der DLL angezeigt wird, sondern im aufrufenden Programm -> dort im Dispatcher -> siehe Grafi
          Christian

          Comment


          • #6
            Habe da gerade was gesehen ...
            Weiss nicht ob das hilft ;-).

            Probier mal anstatt
            myview->Close();

            myview->Free();
            oder nach close()

            Comment


            • #7
              Danke, nützt weder davor noch dahinter noch stattdessen etwa
              Christian

              Comment


              • #8
                ** MIST ***

                ;-)

                Comment


                • #9
                  Stell die Frage doch mal in diesem Forum:

                  http://www.c-plusplus.de/foru

                  Comment


                  • #10
                    Ich hatte vor Kurzem ein ähnliches Problem, allerdings mit dem Austausch von Daten zwischen DLL's. Dies ist eigentlich ein Bug in Windows (meinen jedenfalls die LINUX-Fan's).

                    Leider kann ich Deine Fehlermeldung nicht mehr sehen, da wohl vom Server entfernt.

                    Es muss zwingen sichergestellt sein, dass Speicher, der innerhalb einer DLL allokiert wird, auch dort deallokiert wird. Das gleiche gilt natürlich auch für die EXE.

                    Beispiel: Wenn das Fenster aus der EXE geöffnet wird oder sonstige Zugriffe darauf laufen (z. B. allokieren von Strings zur Ausgabe im Fenster der DLL), versucht die DLL auch diesen Speicher zu deallokieren

                    Comment


                    • #11
                      Hallo Christian,

                      der Fehler geschieht doch in dem aufrufenden Formular. Hast Du den CodeGuard mal angeworfen? Vielleicht kann er ja einen Hinweis liefern.

                      Grüße Joche

                      Comment


                      • #12
                        ich hatte auch mal ein ähnliches Problem, weiss jedoch bis heute nicht woran es liegt, hat jedenfalls mit dem laden von dlls zu tun.
                        Was Diese Exception betrifft, die beim Beenden des Programms kommt, sie tritt nur dann dann auf, wenn man das Programm vom C++ Builder startet. Läuft das Programm später im stanalone-Modus, kommt diese Exception nicht mehr.
                        Es könnte sich auch um einen Fehler im Debugger vom C++Builder handeln.

                        Grüße
                        Sebastia

                        Comment


                        • #13
                          Der Codeguard läuft irgendwie nicht (mehr). Vielleicht liegt es daran, dass ich gestern Windows repariert habe.

                          Tatsächlich, Standalone läuft das Programm durch. Ich werde wahnsinnig, da sucht man und sucht

                          Danke an all
                          Christian

                          Comment

                          Working...
                          X