Jupp, bei Packages geht nur die selbe Delphi-Version und womöglich auch noch die gleiche Update-/Patch-Version.
Als
DLL mit Laufzeitpackages praktisch das Selbe.
DLL ohne Packages, aber mit Shared Memory -> in einem gewissen Bereich geht es mit mehreren/vielen Delphi-Versionen (so lange das SharedMemory auf beiden Seiten kompatibel ist)
Aber natürtlich sollte man hier auch keine Klassen/Objekte benutzen. (alles nur virtuelle Methoden, wäre grade so noch möglich)
DLL ohne alles, möglichst noch mit cdecl oder stdcall, und als String nur der WideString, schon ist es nahezu egal, was die andere Seite nutzt.
WideString ist eine Kapselung von
SysStringLen und seinen Freunden, was auch andere Sprachen verstehen können.