RE: DLL einen String zurückgeben lassen
Du scheinst hier Eingabe- und Ausgabeparameter und den Rückgabewert einer Funktion gleich zu behandelen und das ist nicht ganz korrekt.
LabVIEW verwendet ein eigenes Speicherverwaltungssystem das noch am ehsten mit managed Code in .Net übereinkommt, aber nicht kompatibel ist (denn das LabVIEW System wurde ungefähr 20 Jahre vor .Net entwickelt). Das LabVIEW Speicherverwaltungssystem erlaubt es um innerhalb von LabVIEW Code (also innerhalb des managed Systems) beliebig Datenbuffer zwischen Komponenten auszutauschen. Aber das DLL Interface basiert vollkommen auf C Konventionen, die sich vor allem darin auszeichnen dass fast keinen Konventionen bestehen. Fast alles ist theoretisch möglich und zugelassen aber wenn der Aufrufer und Augerufene sich nicht an die jeweiligen, arbiträren, Konventionen halten, dann geht gar nichts mehr.
LabVIEW limitiert diese Interface deshalb bewusst und eine dieser Limitation ist, dass ausser für LabVIEW Native Datentypen (die damit dann im LabVIEW Managed System funktionieren) immer der Aufrufer allen Speicher für alle Parameter bereitstellen muss. Den Speicher fUr einen Rückgabewert einer Funktion kann aber eben nicht durch den Aufrufer bereitgestellt werden. Die Alternativen um doch Arrays und Strings als Rückgabewert zuzulassen sind alle grundsätzlich nicht standardisiert und führen entweder zu Einschränkungen bei Multithreadaufrufen oder zu Speicherlecks wenn der Aufrufer vergisst den zurückgegebenen Buffer nicht sauber zu deallozieren. Da er ihn aber nicht angelegt hat ist die Chance gross dass er das eben doch vergisst. Vorsorgehalber immer deallozieren ist aber genau so schlecht, denn wenn die Funktion den Wert im statischen Speicher zurückgibt wird das Betriebssystem gewaltig reklamieren, wenn versucht wird diesen Pointer zu deallozieren. Die Einschränkung der möglichen Datentypen im DLL Interface ist also eine bewusste und gute Wahl der LabVIEW Entwickler.
|