ShareMem ist dafür da, wenn man "verwalteten" Speicher über
DLL/EXE-Grenzen hinweg nutzt,
da z.b. der
String
im Delphi-MemoryManager verwaltet wird und jede
DLL oder EXE grundsätzlich erstmal ihren eigenen MemoryManager mitbringt.
In der
DLL einen String erzeugen (wird im MM der
DLL verwaltet) und diesen dann in der EXE oder einer anderen
DLL verändern/freigeben knallt natürlich, da Delphi dort versicht den "lokalen" MemoryManager der anderen EXE/
DLL zu nutzen.
Genauso ist das z.B. mit der
RTTI, weswegen man keine Klassen über
DLL/EXE-Grenzen hinweg nutzen darf.
Außer bei BPLs, welche den Speichmanager und die
RTTI gemeinsam nutzen (ähnlich zu ShareMem).
An deiner Stelle würde ich aber auf Interfaces ausweichen.
PS: Den WideString kann man überall nutzen, da dieses kein richtiger Delphi-Typ ist.
Und WideChar kann man sowieso überall nutzen.
WideString = Umleitung zu
SysAllocStringLen,
SysReAllocStringLen,
SysFreeString und
SysStringLen