(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.
mich hat das mit den handles auch sehr gewundert, aber das ganze wird im code ohne referenz übergeben und auch auch bei allen beispielen in labview. das scheint irgendwie so gewollt zu sein. ich hab meinen vorgesetzten gefragt ich soll es so lassen wie es bisher war.
vielen dank für deine sehr ausführliche antwort.
eine kleine hilfestellung wäre noch nett.
und zwar ist es so, dass ich im blockdiagramm:
Rechte Maustaste -> Eigene Bibliotheken
hier wird die Bibliothek angezeigt, aber meine neue Funktion wird da nciht angzeigt. Wie bekomm ich denn das neue vi da mit rein? Es ist im gleichen Ordner gespeichert wie die anderen.
Vielen Dank

(14.01.2013 16:10 )leon_lab schrieb: [ -> ]also keine ahnung,
ich hab das neue vi dort abgespeichert wo die alten sind in diesem user.lib ordner, aber es wird einfach da nicht angezeigt....
http://zone.ni.com/reference/de-XX/help/..._controls/
warum geht das bei mir nicht? was mach ich falsch?
Vielen Dank 
Abspeichern alleine nützt nichts, man muss es auch in der lvlib hinzufügen. Öffne die lvlib mal, sollte dann ähnlich aussehen wie ein Project und dann mit rechter Maustaste Add->File irgendwo im Public Folder hinzufügen.
Was das Handle angeht, da braucht man gerade keine Referenze, da Du das Handle selber als Wert übergeben willst, nicht den Inhalt des Handles, so es denn wirklich ein Pointer ist. Denn void* kann in C alles mögliche sein, im Prinzip ein Pointer auf irgendwas aber auch nur ein Index in eine private Tabelle. Was wo und wie kannst Du als Benützer nicht bestimmen, nur dass der Wert des Handles irgendwie in einen Pointer passen muss. Und gerade deshalb sollte man die CLNs alle anpassen und den jeden "void *handle" Parameter als Pointer sized Integer konfigurieren statt ihn als int32 Integer zu konfigurieren. Denn das erste ist sowohl in 64 Bit als auch 32 Bit LabVIEW korrekt aber das zweite nur in 32 Bit LabVIEW.
Irgendeine der Funktionen wird das Handle öffnen und wenn es nicht als Funktionswert zurückgegeben wird ist der entsprechende Funktionsparameter als void **handle deklariert. Hier muss man den Pointer sized Integer schon als Referenz übergeben.
Vielen Dank für deine Antwort.
Zitat:Was das Handle angeht, da braucht man gerade keine Referenze, da Du das Handle selber als Wert übergeben willst, nicht den Inhalt des Handles, so es denn wirklich ein Pointer ist. Denn void* kann in C alles mögliche sein, im Prinzip ein Pointer auf irgendwas aber auch nur ein Index in eine private Tabelle. Was wo und wie kannst Du als Benützer nicht bestimmen, nur dass der Wert des Handles irgendwie in einen Pointer passen muss. Und gerade deshalb sollte man die CLNs alle anpassen und den jeden "void *handle" Parameter als Pointer sized Integer konfigurieren statt ihn als int32 Integer zu konfigurieren. Denn das erste ist sowohl in 64 Bit als auch 32 Bit LabVIEW korrekt aber das zweite nur in 32 Bit LabVIEW.
Werde ich mal vorlschalgen das so zu machen.

Vielen Dank für deinen Hinweis.
Zitat:Abspeichern alleine nützt nichts, man muss es auch in der lvlib hinzufügen. Öffne die lvlib mal, sollte dann ähnlich aussehen wie ein Project und dann mit rechter Maustaste Add->File irgendwo im Public Folder hinzufügen.
Das hab ich schon gemacht nur leider geht es nicht. Wenn ich das VI alleine in den user.lib Ordner stecke, wird es einwandfrei angzeigt, sobald ich es aber in einen Unterordner stecke, wird das VI nicht angezeigt. Die anderen VI´s aber irgendwie schon.
Ich verstehe die Welt nicht mehr gibt es da evtl. noch irgendwo eine Sondereinstellung? Muss man da noch irgendwie bei einem VI und der lvlib etwas einstellen? Weil das VI ist 100% im Ordner wo die anderen VI´s sind und es ist auch der lvlib auf die, die anderen zugreifen.
Ich glaub mir hilft solangsam nur noch

, hehe

Ich bin das jetzt umgangen indem ich einfach eine neue Bibliothek angelegt habe und dort alle VI´s hinzugefügt habe.
Die alte musste ich erst löschen sonst hat er das mit der Bibilothek-Zugehörtigkeit nicht kapiert. Vielleicht kann da noch jemand was dazu schreiben, warum er das neue VI nicht in der alten Bibliothek akzeptiert hat.
Jetzt hab ich aber das Problem, dass die VI´s eigene Icons haben. Die neue lvlib und der Unterordner haben dieses Icon jetzt nicht. Wie kann ich das Icon denn setzen?
Vielen Dank.
(15.01.2013 09:26 )leon_lab schrieb: [ -> ]Jetzt hab ich aber das Problem, dass die VI´s eigene Icons haben. Die neue lvlib und der Unterordner haben dieses Icon jetzt nicht. Wie kann ich das Icon denn setzen?

Oje, ich vermute mal dass Du in dem user.lib eine Bibliothek hattest. Dort werden die VI Symbole über eine
MNU Daten geregelt und im Blockdiagramm (rechte Maustaste) angezeigt. Ich vermute dass das der Grund
ist, warum Deine VI nicht angezeigt worden ist. Dort sollte man auch nichts drin ändern, bis man weiss was
man tut.
Daher nochmal anders gefragt: WO genau wird Dein VI nicht angezeigt? (Blockdiagramm, rechte Maustaste?
oder z.B: im Projekt-Explorer in der erstellten vilib?
