LabVIEWForum.de - DLL einen String zurückgeben lassen

LabVIEWForum.de

Normale Version: DLL einen String zurückgeben lassen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
hallo,

ich habe ein VI erstellt welches mir einen HEX-Code eines externen Prüflings abfrägt.

Nun, dieser HexCode liegt in einem unsigned Byte vor und es wird
a) korrekt in LabView angezeigt wird, wenn ich das u8 Anzeigeelement (Array) verwende und
b) korrekt in LabView angezeigt wird, wenn ich u8 in String konvertiere

Ich würde aber gerne den String zurückgeben lassen.
Dies ist jedoch nicht ganz trivial.
Pascal-String-Pointer wären mir lieber, aber es gibt in jedem Fall ja nur char-Arrays...

Wie kann ich den VI-Ausgang aktivieren?

[Bild: 2F9KhOKr7Y]

Gruß
Hallo,

die Funktion ist vom Typ "void". Diese hat keinen Rückgabewert. Du kannst also nicht beim Aufruf der Funktion sagen, dass du etwas haben willst, was deine Funktion (die dll) garnicht hergibt.

MfG Carsten
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.
@hook & rolf, danke für eure Antworten.

Ich weiss das ich einen void-Typ habe, weiß aber nicht wie ich diesen ändern kann, dass er mir was zurückgibt.
dies habe ich im Frontpanel rechts oben mit dem Eimer-Symbol zwar gesetzt, jedoch hat sich daran nichts geändert.

Auch in Post #3 verstehe ich nicht warum ich vorsorgehalber immer deallozieren sollte. Mit was mache ich das denn?
Die Alloziierung übernimmt doch LabView in den meisten Fällen oder?

Gruß
(20.03.2012 13:15 )arphex schrieb: [ -> ]Auch in Post #3 verstehe ich nicht warum ich vorsorgehalber immer deallozieren sollte. Mit was mache ich das denn?
Die Alloziierung übernimmt doch LabView in den meisten Fällen oder?

Das kannst du so gar nicht machen und LabVIEW kann es nicht automatisch da es nicht weiss ob es das machen soll oder nicht und wenn es falsch liegt, dann geht es gut falsch. Dies ist aber ein Problem das nur auftritt wenn Du eine DLL in LabVIEW mit der Call Library Node aufrufst und das tust Du meines Erachtens hier gar nicht.

Dein Problem liegt anders da Du ja in LabVIEW eine DLL erstellen willst. Das ist etwas komplet anderes (und LabVIEW intern noch viel komplizierteres).

Derr DLL Generator Interface unterstützt keine Strings als Rückgabewerte (wegen der Gründe kann man meinen vorigen Beitrag lesen aber wenn das zu kompliziert ist, nimmst Du einfach mal an dass das so ist). Da Dein VI aber scheinbar keine anderen Frontpanelelemente hat, kannst Du in der DLL Konfiguration halt auch nur eines dieser nicht bestehenden anderen Frontpanelelemente an den Rückgabewert der DLL Funktion zuweisen, also 0, nada, nientes.

Natürlich liesse sich in dieser Hinsicht einiges mehr eindeutig sagen, wenn Du im ersten Beitrag statt eines Screenshots der Konfiguration ganz einfach Dein DLL Project angehängt hättest. Ein Bild sagt zwar oft mehr dann tausend Worte, aber der Sourcecode ist immer noch die ultimative Instanz bei Programmierfragen (und um ein simples DLL Project mit Bildern zu dokumentieren hast Du eigentlich schon minimal 3 Bilder nötig (VI Front Panel, VI Diagramm, DLL Funktions Interface Konfiguration und selbst das gibt noch nicht unbedingt alle wichtigen Informationen her). Big Grin

Aber Du brauchst den Ausgangsstring ja auch nicht als Rückgabewert zu konfigurieren, denn den hat Dir LabVIEW schon als Funktionsparameter "Ausgabe" eingefügt, und Strings als Funktionsparameter zu übergeben ist wesentlich eindeutiger definiert in C, was die Speicherverwaltung davon angeht.
Hi,

ich verstehe was du meinst.
Erstmal im Anhang die .zip-Datei zur verdeutlichung des Problems.

Ich habe mehrere Ausgaben, von denen ich aber initial erstmal die Eingabe und Ausgabe verwenden möchte.
Diese würde erstmal für die Kommunikation mit der COM-Schnittstelle reichen.

Ansonsten ist das noch eine große Construction

Gruß
Hallo nochmal,
ich habe jetzt einen Thread gefunden der das Thema anscheinend behandelt.

Nur verstehe ich den letzten Antwortsatz nicht, kann mir das jemand erklären?

http://forums.ni.com/t5/LabVIEW/Set-Retu...-p/1075727
Hallo Arphex,

Zitat:Nur verstehe ich den letzten Antwortsatz nicht,
Zitat:Thanks for you help - I got it figured out
Ich glaube, das musst du etwas besser spezifizieren...
http://translate.google.com/#en|de|Thank...ured%20out

In diesem Fall übersetzt Google völlig korrekt.

Gruß, Jens
Seiten: 1 2
Referenz-URLs