Klasse im Shared Bereich halten



  • Hallo zusammen,

    ich grüble über eine Lösung, wie man eine Klasse im Shared Member-Bereich einer DLL (über #pragma data_seg) halten kann. Ist das überhaupt möglich? Die Klasse besitzt ihrerseits Member, die dynamisch erweitert werden können (Maps).

    Derzeit habe ich einen Pointer in der Shared Sektion stehen, dem beim ersten Aufruf (erste Istanzierung) der DLL eine Klasseninstanz zugewiesen wird. Dumm ist dabei, das folgende DLL-Instanzen, die den Pointer verwenden, aber keinen Zugriff auf die Member der Klasse bekommen, weil die Werte alle uninitialisiert sind.

    Als Alternative hatte ich schon an eine Speicherreservierung für die Klasse über GlobalAlloc gedacht, aber das geht nicht recht, weil dann der Konstruktor der Klasse nicht aufgerufen wird.

    Für hilfreiche Tipps und Ratschläge schon mal im Voraus vielen Dank!
    Wes



  • Ich bin mir nicht sicher ob ich dein Problem verstanden hab. Aber kannst du deiner DLL nicht einfach eine

    Init(void* classInstance)
    

    hinzufügen? Die rufst du dann halt auf um deinen DLLs die Klasseninstanz zu zuweisen.



  • Eine einfache Klasse (die z.B. keine strings/container o.ä. enthält) kann man mit placement new im shared Bereich anlegen.
    Für Dinge wie eben strings, container etc. braucht man einen allocator der das macht.

    Guck mal in der boost, da gibt es irgendwo eine Library die genau sowas kann.


  • Mod

    Man sollte vermeiden Klassen in slch einen shared Bereich zu legen. Am besten man bleibt bei einem POD, sprich einer normalen Struktur.
    Sobald eine virtuelle FUnktion im Spiel ist gerät eine Klasse in solch einem Bereich außer Rand und Band.

    An diesen Schnittstellen sollte die Daten auf einfachste Weise mit elementaren C Objekten und puren Handles und Strukturen abgesichert und gespeichert werden.
    Alles was mit dynamischer Allokation daherkommt und arbeitet verbietet sich von selbst.



  • Danke für die Antworten.
    Dann werde ich wohl besser nur einige Member im Shared Bereich unterbringen und diese dann halt per Pointer / Referenz in die Nonshared Klasse einbinden.


Anmelden zum Antworten