dll pluginsystem



  • tach zusammen (war schon lange nicht mehr hier 😉 )

    ich schreibe gerade ein pluginsystem das in etwa so laufen sollte.
    ich habe eine basisklasse von der alle plugins erben und die abgeleitete
    klasse wird in der dll instanziert und gibt mir einen zeiger zurück.
    mein problem ist das ich die dll wieder entladen möchte (denn eigentlich brauche ich sie nicht mehr) aber den instanzierten speicher möchte ich behalten.
    aber die laufzeitumgebnung räumt einfach zu viel auf und ich kann den zeiger nicht mehr derefenzieren.

    pseudo code:

    typedef std::map<std::string, Converter*> factory_type;
    // verzeichniss auslesen und in vector speichern ...
    for(file_list_type::iterator it = file_list.begin(); it != file_list.end(); ++it)
    {
        PluginLoader loader((*it).c_str());
    
        Converter *p = loader.CreateObject<Converter>("GetPlugin");
    
        if(p) factory.insert(factory_type::value_type(p->GetExtension(), p));
    
        // hier verlasse ich natürlich den scope und die dll wird wieder entladen
    }
    // ...
    factory_type::iterator it = factory.find(xyz);
    if(it != factory.end())
        (*it->second).Load(zyx);
    

    natürlich könnte ich auch die loader dynamisch machen und die dll einfach geladen lassen aber das ist nicht das was ich will.
    hat irgendjemand ein paar verbesserungsvorschläge oder andere ideen?

    [ot]
    muss sein 😃 :xmas1: :xmas2:



  • [push] :xmas1: :xmas2:
    hat keiner ne idee, wie ich die instanz behalte



  • Du kannst die DLL nicht entladen solange du Funktionen aus dieser benutzen willst. Ich geh mal davon aus, dass du virtuelle Funktionen benutzt, also musst du die DLL im Speicher halten um auf die Funktionn und die VTable zugreifen zu können. Das Problem mit dem Speicher ist leicht gelösst dadurch, dass du dem Plugin einen Zeiger auf die Speicherallokationsfunktion des Hauptmoduls übergibts.



  • so weit klar ich dacht blos nicht windows mit new allokierten von sich aus wieder löscht. macht vielleicht auch sinn da nicht jeder seinen speicher im hundertprozent aufräumt und einen "chaotischen" heap zurücklässt.

    Ben04 schrieb:

    Das Problem mit dem Speicher ist leicht gelösst dadurch, dass du dem Plugin einen Zeiger auf die Speicherallokationsfunktion des Hauptmoduls übergibts.

    kann dir gerade nicht folgen.



  • Wenn du in beiden Teilen (also EXE und DLL) die msvcrt.dll verwendest, dürfte er den Speicher nicht wegräumen. (Bin mir nicht 100%, aber ziemlich sicher).



  • verwende kein vc



  • Sondern?



  • Ringding schrieb:

    Sondern?

    mingw.



  • Das arbeitet doch soundso mit msvcrt.dll. Ich weiß allerdings nicht, ob das immer so ist oder optional.



  • Ringding schrieb:

    Das arbeitet doch soundso mit msvcrt.dll. Ich weiß allerdings nicht, ob das immer so ist oder optional.

    ich sizte nicht an einem windows rechner sonst könnte ich es überprüfen. 🙄


Anmelden zum Antworten