Gültigkeitscheck von Plugins



  • Moin,

    ich versuche mich gerade daran, eine Pluginarchitektur für ein Projekt zu schreiben. Die Plugins werden (im Moment nur unter Windows, aber bis auf das Laden von .dll s sollte eigentlich alles Plattformneutral sein) dynamisch zur Laufzeit geladen.

    Nach dem Laden gibt es einen Check, ob die Compilereinstellungen des Plugin-Loaders und des Plugins zusammenpassen. Zum Beispiel wird das Padding von Strukturen überprüft, und ein paar andere Dinge, für die mir eine funktionierende Prüfung eingefallen ist, gecheckt.

    Nun gehen allerdings auch z.B. Objekte vom Typ std::vector<T> ins Plugin hinein und hinaus. Wenn hier nun die Iteratoren (z.B. weil das Plugin als Debug und der Loader als Release gebaut wurde) nicht zusammen passen, dann kracht es verständlicherweise. Hat vllt. jemand eine gute Idee, wie man sowas zur Laufzeit prüfen kann, ohne gleich das ganze Programm ins Nirvana zu reißen? Und wenn ja, welche?

    Grüße.



  • hi

    die ueberpruefung ob debug oder release compilierung geht ja recht einfach

    bool is_debug_version(void)
    {
       #ifdef _DEBUG
          return true;
       #elseif
          return false;
       #endif
    }
    

    diese funktion beim laden deines plugins auswerten und mit der kompilierungsart des programms vergleichen und du weißt schon mal ob da alles in ordnung ist.

    meep meep



  • Meep Meep schrieb:

    hi

    die ueberpruefung ob debug oder release compilierung geht ja recht einfach

    bool is_debug_version(void)
    {
       #ifdef _DEBUG
          return true;
       #elseif
          return false;
       #endif
    }
    

    diese funktion beim laden deines plugins auswerten und mit der kompilierungsart des programms vergleichen und du weißt schon mal ob da alles in ordnung ist.

    meep meep

    Okay, auf sowas wird es wohl hinauslaufen. Leider gibt es, gerade bei Iteratoren, noch ein paar andere Dinge, die nicht nur vom Debug-Modus abhängen. Die Range-Checks ( SECURE_SCL oder so ähnlich unter Windows) z.B. Das kann man allerdings in der Tat alles über irgendwelche Precompiler-Anweisungen abfragen.
    Eine etwas weniger plattformspezifische Lösung wäre allerdings toll.



  • hole

    nunja, mir ist nicht bekannt das da ueberpruefungen vorgegeben sind.
    man kann da notfalls auch mit dem sizeof-operator bestimmmte ueberpruefungen machen, die aber bestimmt auch nicht unabhaengig von OS beziehungsweise sogar vom compiler sind.
    unter VC 2010 hat z.b. sizeof(std::vector<int>::iterator) in der release version 4 bytes, in der debug version 12 bytes.
    ich wuerde in deinem fall eine flag-klasse machen, wo du intern ueber precompiler anweisungen alles ausfindig machst, was du wissen willst und dann einfach die flags abfragst. ist anfangs sicherlich eine recht umfangreiche arbeit, aber sowas kann man dann ja schoen in anderen projekten auch weiterverwenden.

    kannst ja ein gemeinschaftsprojekt eroeffnen wo alle ihre ideen beisteuern koennen. 🙂

    Meep Meep



  • Tachyon schrieb:

    Eine etwas weniger plattformspezifische Lösung wäre allerdings toll.

    Dir ist aber schon klar dass es sowas nicht geben wird, ja?


Anmelden zum Antworten