?
Hallo RHBaum,
Hallo an alle dll entwickler.
dlls sind u.a. dazu gedacht von mehreren Programmen verwendet zu werden.
dlls sind auch dazu gedacht Erweiterungen der dll durchzuführen,
ohne ALLE Programme neu bauen zu müssen.
Will man beides (irgendwann) haben sind Structs und Klassen verboten,
es geht schlichtweg nicht (ich kann nichts dafür ).
Wer beides nicht braucht programmiert eine statische lib und
kann dann structs und c++ verwenden.
Warum ?
Structs im Header sind dann extrem gefählich, wenn man die dll erweitern möchte,
aber das ein oder andere exe z.B. nicht neu bauen will weil man z.B. diese spezielle Erweiterung nicht braucht.
Wird das Struct nun z.B. um einen int erweitert,
so ändert sich die Structsize um z.B. 4 Bytes.
Das exe ist aber gegen das alte Struct kompiliert und hat die alte size reserviert (Heap, Stack, ..). Ruft man nun StructInit in der DLL auf hat man UB und es knallt.
Deswegen Vorwärts deklarieren, die interna vom Struct verheimlichen und nur pointer, oder besser noch Handles im Header haben.
Der Speicher wird in der DLL auf dem Heap angelegt und auch in der dll wieder freigeben, das exe reserviert nur 4 Bytes für den Pointer oder das Handle.
Die Daten müssen alle mit gettern und setter abgefragt werden.
Hier werden primitives zurückgegeben, bzw. Pointer/Handles womit dann wieder mit gettern und setter gearbeitet wird ...
Anderes Beispiel:
man ändert die Reihenfolge der Parameter im Struct,
z.B. um eine kleinere Structsize zu erreichen.
Wenn du das exe dann nicht neu baust, passiert auch alles, nur nicht das was gedacht war.
Richtig lustig wird es erst mit Klassen im dll Header,
am lustigsten mit einer abgeleiteten Klassenhierarchie.
Wenn du dann eine neue Methode in einer Basisklasse einfügst und das exe nicht neu baust,
Werden einfach die falschen Funktionen angesprungen, natürlich mit den komplett falschen Daten auf dem Stack.
Gruß Frank