Zugriffsverletzung bei FreeLibrary (Dll enthält VCL-Form)



  • Hallo!

    Ich habe eine DLL mit der folgenden Funktion:

    int __stdcall GefStoffListeShowForm(int iLang)
    {
    iLanguage=iLang;
    VerzeichnisForm=new TVerzeichnisForm(Application);
    VerzeichnisForm->ShowModal();
    VerzeichnisForm->Release();
    delete VerzeichnisForm;
    return 0;
    }
    

    "Verzeichnisform" ist bisher noch so wie es bei der Erstellung automatisch erstellt wird.

    Die DLL wird dynamisch gelinkt.
    Wenn die Funktion aus der DLL aufgerufen wird und der Dialog wird wieder geschlossen erhalte ich die folgende Fehlermeldung:

    Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000.

    Die Funktion wird wie folgt aufgerufen.

    HINSTANCE hDllInst=NULL;
    hDllInst=::LoadLibrary("MeineDll.dll");
    if (hDllInst!=0)
      {
      pGefStoffListeDlg=(GefStoffListeDlg*)::GetProcAddress((HMODULE)hDllInst,
                                                           "GefStoffListeShowForm");
      (*pGefStoffListeDlg)(iLanguage);
      FreeLibrary(hDllInst);
      /*
      try
        {
        FreeLibrary(hDllInst);
        }
      catch (Exception &exception)
        {
        }
      */
      }
    else
      {
      }
    

    Wenn ich die FreeLibrary-Zeile auskommentiere und stattdessen den try/Catch-Block aktiviere ist die Fehlermeldung natürlich weg.
    Ich würde allerdings lieber die Ursache des Fehlers beseitigen.

    Das Forum und Google lieferten bisher keinen hilfreichen Hinweis, obwohl ich die Fehlermeldung mehrfahc gefunden habe.

    Hat jemand einen Tipp für mich?
    Danke!



  • barnie schrieb:

    Wenn ich die FreeLibrary-Zeile auskommentiere und stattdessen den try/Catch-Block aktiviere ist die Fehlermeldung natürlich weg.

    Ich finde das eher unnatürlich. Try/catch fängt doch eigentlich nur Exceptions, keine Schmutzverletzungen!?



  • Hallo!

    Wenn ich ein wenig an den Debugger-Optionen herumschraube, geht es auch ausführlicher:

    EAccessViolation (C00000005) ... Zugriffsverletzung bei Adresse 00000000. Lesen von Adresse 00000000. ...

    Nach einer Prüfung mit CodeGuard vermute ich borlndmm.dll als Verursacher.
    Die DLL hat angeblich bereits Speicher reserviert, auf den dann illegal zugegriffen wird.
    Die brauche ich eigentlich nicht. Also habe ich das RTL-Linken abgeschaltet.
    Hilft leider nicht.
    Offensichtlich mogelt mir noch mindestens eine Komponente (Ohne Quellcode!) diese DLL in mein Projekt. Daher kann ich nicht endgültig prüfen ob die DLL schuld ist.

    In meiner DLL steht aber nun wirklich noch nichts erwähnenswertes drin.



  • Du erstellst VerzeichnisForm mit Application als Owner, löschst es aber selbst. Und schon kracht's wenn die Application versucht das Form ebenfalls zu löschen...

    Versuchs mal mit:

    VerzeichnisForm=new TVerzeichnisForm(NULL);
    


  • Hallo!

    Der Argumentation kann ich mich anschließen.
    Trotzdem scheint die Zugriffsverletzung durch die borlndmm.dll hervorgerufen zu werden.
    Da ich leider nicht alle Komponenten bereinigen kann muß ich die EAccessViolation wohl einfach abfangen.



  • Was passiert, wenn Du das Verzeichnisform->Release(); rausläßt?



  • ich nehme an du hast - wie von Borland erlangt - die memmanager-Library in die DLL dazugelinkt?

    -junix


Anmelden zum Antworten