Klassischer Fehler.
Sowohl in Hauptprogramm als auch
DLL muss ShareMem eingebunden werden.
DLL und Hauptprogramm haben sonst separate Memorymanager.
Uebergibt und manipuliert man nun Strings oder Objekte (alles was dynamisch alloziiert ist), so wird Memory im einen Manager alloziiert und im anderen freigegeben.
Das Resultat ist dann schnell ein korrumpierter Memorymanager und irgendwann (oft beim Programmende) gibt es einen Absturz.
ShareMem verbindet beide Memorymanager so das es dann wieder einer ist.
Erzeuge mal ein leeres
DLL-Projekt mit Delphi und lies dir durch was im Kommentar des erzeugten Files steht.