(14.01.2013 08:25 )leon_lab schrieb: Also der Funktionsheader ist folgendermaßen:
long funktion(void *handle, unsigned int *data);
Das handle wurde in den anderen Beispielen als "Numerisches Element" - vorzeichenloser 32-Bit Interger und wird als Wert übergeben, das habe ich hier auch so gemacht.
Bei dem usigned int *data bin ich mir jetzt einfach nicht sicher wie man das richtig macht.
Ich hab folgendes eingestellt:
Typ: Array
Datentyp: vorzeichenloser 16-Bit Integer
Dim: 1
Arry-Format: Array-Datenzeiger.
Dann hab ich in das Frontpanel ein Array gezogen und hier einen U16 Integer Wert rein und das dann mit dem Connector der DLL verbunden. Ist das so richtig?
VIELEN LIEBEN DANK FÜR EURE HILFE
Für das Handle solltest Du bei allen Funktionen kein "unsigned int32" benützen sondern ein "unsigned pointer sized integer" denn es handelt sich hier ja um einen Pointer. Auch sollte das entsprechende Frontpanel Control überall auf einen uInt64 geändert werden, so dass das Kontroll einen allenfalls 64 Bit Pointerwert übertragen kann.
Dieser Pointer ist zwar in 32 Bit LabVIEW ein 32 Bit Integer aber in 64 Bit LabVIEW eben ein 64 Bit Integer (wobei die DLL dann natürlich auch eine 64 Bit DLL sein muss).
Zwar ist Deine DLL im Moment wahrscheinlich nur als 32 Bit DLL verfügbar und musst Du deshalb auch 32 Bit LabVIEW benützen, aber in einem Jahr könnte das plötzlich anders sein, und dann ist es praktisch wenn man die VIs schon richtig konfiguriert hat und nicht noch einmal durch die ganze Library gehen muss.
Was das Array angeht hier definierst Du in LabVIEW einfach ein "Array von unsigned int32", konfigurierst die Call Library Node als Array, Numerisch 32 Bit Integer, Pass as Array Pointer. Nun musst Du noch sicherstellen dass das Array gross genug ist. Wenn Du der Funktion hier ein Array vorgeben musst aus dem sie lesen soll, initialisierst Du das Array einfach mit den (16) Werten die Du dieser Funktion übergeben willst. Wenn die Funktion aber in dieses Array Werte schrieben will, MUSST Du sicherstellen dass das Array in LabVIEW entsprechend alloziert wird. Eine "Initialize Array" Node macht das. Wenn Du das Array nicht oder zu klein allozierst bekommst Du ziemlich sicher einen errror 1097 und ganz 100% sicher korrumpiert die DLL irgendwelche Speicherbereiche.
(13.01.2013 00:41 )Trinitatis schrieb: Ob man einer DLL einen Cluster übergeben kann, weiß ich gar nicht - würde mich auch mal interessieren, ich denke mal: eher nicht.
Das geht sehr wohl. Wäre im Prinzip in diesem Fall sogar möglich, aber ist normalerweise nur sinnvoll für struct Parameter die als Pointer übergeben werden. Um das machen zu können darf die Struktur nur Skalars enthalten (also keine Strings, Arrays oder Funktionspointer) und muss der CLN Parameter als "Adapt to Type" konfiguriert werden.