' schrieb:Das sehe ich auch so. 
Nein, gedacht ist das genau richtig.
Ich gehe davon aus, dass es so geht - so gehen soll.
Nur eine kann richtig sein.
Ich gehe davon aus, deine erste Methode ist richtig. Was richtig ist, muss in der Beschreibung der DLL-Funktionen stehen. Wenn da eine Funktion mit nur einem Parameter steht, kann nur deine erste Version richtig sein. Und die Methode mit den 50 Eingängen - sowas macht keiner.
Also der Prototyp (leider Visual Basic BHÄÄÄÄÄ) sagt deutlich dass die struct (der C Begriff eines Clusters) ByRef übergeben wird. Das heisst es muss ein Pointer übergeben werden. Wenn es ByVal wäre wäre der Zweite Approach richtig (mein lieber Himmel!!!).
Zitat:So einen großen Cluster mit so vielen Parametern hab ich auch noch nicht gesehen. Drei Möglichkeiten fallen mir ein, die du mal prüfen müsstest. Ich hätte ja die erste bevorzugt.
Erstens:
Cluster erstellen. Dann ein Array of U8 erstellen, das die Länge des erwarteten Speicherbereiches hat. Danach die Daten aus dem Cluster der Reihe nach manuell hart typcasten in das Array of U8. DLL aufrufen und das ganze rückwärts. Für kleine, komplexe Cluster kann man das so machen.
Zweitens:
Du kannst mal "Daten serialisieren" probieren. Dabei gibst du den Cluster auf das Serialisier-Element - heraus kommt ein Datenstream in Form eines Strings. Den String gibt du an die DLL als PChar. Rückwärts musst du das selbe probieren: den String aus dem DLL-Knoten auf ein Deserialisierungs-Element. Das Element bekommt den Cluster als Typeingang und liefert am Ausgang einen Datencluster. Ob das geht weiß ich nicht. Ich war noch nie in der Situation, einen derartigen Cluster an eine DLL zu übergeben.
Drittens:
Eine Wrapper-DLL. Mach dir eine C++-DLL, die auf der einen Seite die User-DLL bedienen kann. Das sollte einfach sein. Und auf der anderen Seite machst du eine oder mehrere Funktionen, die LV bedienen kann. Das ist auch einfach.
1) ist möglich aber immens viel Arbeit. Ich habe nicht im Detail die Definition betrachtet aber ich konnte so auf die Schnelle keine Array und String Pointer sehen. Dann geht es nämlich eigentlich nicht. LabVIEW Arrays und Strings sind nicht direkt kompatibel mit C Strings und Arrays. Direkt als Parameter kann man die durch die Call Library Node übersetzen lassen nach C Pointern aber innerhalb eines Clusters geht das nicht.
Was ich sah waren fixed size Arrays (die haben alle eine Nummer zwischen eckigen Klammern hinter dem Variablennamen). Diese kann man durch einen eingebetteten Cluster mit der entsprechenden Anzahl Elemente vom Typ den die Variable hat simulieren.
2) Vergiss es. Das Serialisier Format packt alle Daten im Cluster zusammen und fügt bei Arrays und Strings noch eine i32 Zahl hinzu die die jeweilige Anzahl der Elemente angibt die nun folgt.
3) Mein absoluter Verzug. Diese Funktion alleine macht diesen Wrapper eigentlich schon fast eine Pflicht. Wenn da noch andere Funktionen hinzukommen mit auch nur halb so komplexen Parametern dann hat sich der Wrapper im Endeffekt ganz sicher bezahlt gemacht.
Rolf Kalbermatter