INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

UUID als Datentyp für eine DLL erstellen



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

16.02.2012, 02:46
Beitrag #1

jabami Offline
LV-Novize
*


Beiträge: 14
Registriert seit: Feb 2012

LabView 2011
2011
DE


Deutschland
UUID als Datentyp für eine DLL erstellen
Hallo zusammen,

ich versuche seit Tagen eine C++ API in LabView zum laufen zu bekommen. Das Header-file kann man sich hier an sehen:

http://codelaboratories.com/research/vie...camera-api

die zugehörige DLL-Datei habe ich. Neben allen anderen Funktionen würde ich zunächst einmal gern die Funktion

GUID CLEyeGetCameraUUID(CameraIndex as int)

umsetzen. Scheitere aber an dem Datentyp der GUID (respektive UUID also 16-Byte-Zahl, die hexadezimal notiert und in fünf Gruppen unterteilt wird bspw. 550e8400-e29b-11d4-a716-446655440000).
Ist das überhaupt machbar?
Nutze ich dann einen Cluster-Datentypen? Wenn ja, wie formatiere ich den damit dieser 16-Byte-Zahlen akzeptiert?

Bin für jede noch so kleine Hilfe dankbar.

Beste Grüße,
Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
16.02.2012, 03:08 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2012 03:09 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: UUID als Datentyp für eine DLL erstellen
Die LabVIEW Call Library Node kann nur Skalars und Strings als Returnwert behandeln. Und es gibt keine Skalars die 128 Bit gross sind. Man muss diesen Parameter also also Pointersized Integer konfigurieren und dann mittels Aufruf der LabVIEW C Funktion MoveBlock mit einer zweiten Call Library Node die 16 Byte aus dem Pointer in einen genügend grossen Cluster kopieren.

Zum Thema MoveBlock gibts hier, im LabVIEW Forum bei forums.ni.com und auf lavag.org viele Beiträge. Auch Google will Dir da einiges an Informationen liefern.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.02.2012, 19:29
Beitrag #3

jabami Offline
LV-Novize
*


Beiträge: 14
Registriert seit: Feb 2012

LabView 2011
2011
DE


Deutschland
RE: UUID als Datentyp für eine DLL erstellen
Hallo Rolf,

vielen Dank für Deine Antwort. Ich habe jetzt die MoveBlock Funktion verwendet, so wie Du es empfohlen hast. Einen 16 Byte Cluster initialisiere ich mit 16 X 8 Bit Werten. Kann ich dies überhaupt tun, auch wenn ich Hexadezimalwerte erwarte?
Die vi liefert, so wie sie jetzt ist allerdings auch noch einen Fehler an meinem ersten DLL Knoten (also der welcher auf die Kamera Dll verweist -links im Bild). Müsste nicht eher ein Fehler in der MoveBlock funktion angezeigt werden? Im Anhang mal eine Abbildung der jetzigen Vi.

Beste Grüße,
Jan


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.02.2012, 20:06
Beitrag #4

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
RE: UUID als Datentyp für eine DLL erstellen
Offtopic2: @jabami: Was soll "Novize" bei der LabVIEW-Version in Deinem Profil sein? Bitte Profil_ergaenzen.
Noch was: Arbeitet Ihr beiden neuerdings in Japan (wenn ich mir so die Uhrzeiten Eurer Posts anschaue)? Big Grin

Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.02.2012, 21:08
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: UUID als Datentyp für eine DLL erstellen
Was für ein Fehler? Und wie ist die MoveBlock Funktion konfiguriert?

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.02.2012, 21:34
Beitrag #6

jabami Offline
LV-Novize
*


Beiträge: 14
Registriert seit: Feb 2012

LabView 2011
2011
DE


Deutschland
RE: UUID als Datentyp für eine DLL erstellen
Hallo Rolf,

die Fehlermeldung (ist für mich) relativ nichtssagend. Ich verstehe eben nur nicht warum sie nicht durch den MoveBlock DLL-Knoten ausgelös wird sondern eben durch den Knoten davor. Es macht den Anschein als wenn der Pointer den Knoten nicht "verlässt". Gibt es eine Möglichkeit sich den Pointer direkt anzeigen zu lassen?

Ich habe zum einen die MoveBlock Konfiguration angehängt, als auch die Fehlermeldung samt Ihrer Beschreibung. Danke fürs drüberschauen.

Gruß,
Jan


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
17.02.2012, 01:14
Beitrag #7

jabami Offline
LV-Novize
*


Beiträge: 14
Registriert seit: Feb 2012

LabView 2011
2011
DE


Deutschland
RE: UUID als Datentyp für eine DLL erstellen
Hallo zusammen,

oh man ich versteh es einfach nicht. Ich habe eine .dll mit zugehöriger Header Datei (siehe erster Post). Ich kann eine Funktion aus dieser dll ansprechen, nämlich die einfachste. In diesem Fall: CLEyeGetCameraCount. Diese Funktion gibt mir als integerwert einfach die anzahl angeschlossener Kameras aus. In meinem Fall eine 1.
Nun will ich die nächste Fnktion ansprechen die mir die UUID der angeschlossenen Kamera ausgibt. Ich füttere die Funktion mit dem Kameraindex (hier 1) und setze den Dll-Knoten Rückgabewert auf "zeigergroßer integer". Jetzt kann ich diesen Pointer in eine zweite MoveBlock Dll-Knoten einbringen der mir dann die hinterlegten Daten (hier die UUID) in ein vorher initialisierten 128 bit Cluster schreibt. Den Bit-Cluster initialisiere ich mit 8 mal 8 bit Integer Werten (U8). Erwarten würde ich nun das am Ausgang meiner MoveBlock konstruktion die UUID in den Cluster geschrieben wird. Stattdessen erhalte ich Fehlermeldungen an meinem ersten DLL-Knoten. Also dem der die eigentliche Funktion implementiert. Wo ist hier mein Denkfehler? Ich komm partout nicht dahinter....

Euch noch einen schönen Abend,
Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
17.02.2012, 20:23
Beitrag #8

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: UUID als Datentyp für eine DLL erstellen
(16.02.2012 21:34 )jabami schrieb:  Hallo Rolf,

die Fehlermeldung (ist für mich) relativ nichtssagend. Ich verstehe eben nur nicht warum sie nicht durch den MoveBlock DLL-Knoten ausgelös wird sondern eben durch den Knoten davor. Es macht den Anschein als wenn der Pointer den Knoten nicht "verlässt". Gibt es eine Möglichkeit sich den Pointer direkt anzeigen zu lassen?

Ich habe zum einen die MoveBlock Konfiguration angehängt, als auch die Fehlermeldung samt Ihrer Beschreibung. Danke fürs drüberschauen.

Gruß,
Jan

Welche Aufrufkonvention hast Du eingestellt? Die LabVIEW MoveBlock Funktion muss mit C Aufrufkonvention angerufen werden. Deine CLEye API weiss ich jetzt so nicht, aber da sie im Header scheinbar keine explizite Deklaration festlegt wird es wohl Mcrosoft C default sein, und das wäre auch C! Aber der Programmierer kann im Projektfile die Defaultkonvention überschraiben, sodass es nicht sicher ist, ohne das Projektfile, was ja wohl vom Hersteller nicht herausgegeben wird.

Die Konfioguration der MoveBlock Funktion sieht falsch aus. Der erste Parameter ist soweit korrekt, aber der zweite sollte nicht als ILVData sondern als einer der anderen drei Untertypen von Adapt to Type eingestellt sein (die Unterschiede der ersten drei Typen ist nur bei Daten die LabVIEW Handles sind von Wichtigkeit). Der Letzte Parameter ist auch kein Integerpointer sondern ein ganz einfacher Signed Integer, Passed by Value.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.03.2012, 18:00
Beitrag #9

jabami Offline
LV-Novize
*


Beiträge: 14
Registriert seit: Feb 2012

LabView 2011
2011
DE


Deutschland
RE: UUID als Datentyp für eine DLL erstellen
Hallo Rolf,

ich hab es jetzt 2 Wochen immer mal wieder versucht. Ich gebe auf. Ich bin mir mittlerweile sicher das LabView den GUID Datentyp in keinster Weise unterstützt, auch nicht durch die MoveBlock funktion. Ich glaube es liegt einfach daran, das eine GUID ein zusammengesetzter Datentyp ist und somit eben nicht nur einen Zeiger besitzt (so jedenfalls meine Laienhafte Vermutung). Das Problem ist wohl nur durch das Schreiben und implementieren einer Wrapper .dll zu lösen. Da ich aber so gut wie keine C# oder C++ Programmierkenntnisse besitze muss ich passen.

Dennoch Danke für die entgegengebrachte Hilfe,

Beste Grüße,
Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
03.03.2012, 22:25 (Dieser Beitrag wurde zuletzt bearbeitet: 03.03.2012 22:30 von rolfk.)
Beitrag #10

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: UUID als Datentyp für eine DLL erstellen
(03.03.2012 18:00 )jabami schrieb:  Hallo Rolf,

ich hab es jetzt 2 Wochen immer mal wieder versucht. Ich gebe auf. Ich bin mir mittlerweile sicher das LabView den GUID Datentyp in keinster Weise unterstützt, auch nicht durch die MoveBlock funktion. Ich glaube es liegt einfach daran, das eine GUID ein zusammengesetzter Datentyp ist und somit eben nicht nur einen Zeiger besitzt (so jedenfalls meine Laienhafte Vermutung). Das Problem ist wohl nur durch das Schreiben und implementieren einer Wrapper .dll zu lösen. Da ich aber so gut wie keine C# oder C++ Programmierkenntnisse besitze muss ich passen.

Dennoch Danke für die entgegengebrachte Hilfe,

Beste Grüße,
Jan

Ein GUID, zumindest in Windows C API Notation, ist ganz einfach eine C Struktur mit insgesamt 16 Bytes. Da ist nichts magisches dran und das geht mit LabVIEW absolut sicher. Das einzige Problem könnte sein, dass die Funktion diesen Buffer als Funktionsrückgabewert zurückgibt anstelle durch einen Parameter. Wo die Funktion diesen Buffer anlegt und wie lange sie ihn gültig hält ist ganz einfach ausserhalb der Kontrolle von LabVIEW, Das könnte ein statischer Buffer sein (einfach zu implementieren, wenig Chancen auf Fehler, aber problematisch wenn das API Multithreaded aufgerufen wird), ein dynamischer Speicherbereich, der einmal angelegt wird und bis zum ausladen der DLL bestehen bleibt (gleiche Vor- und Nachteile wie statischer Speicher aber komplizierter zum implementieren für den DLL Programmierer), oder ein dynamischer Speicherbereich der jedesmal angelegt wird (Laufzeitverzögerung durch das jeweilege Anlegen und initialisieren des Buffers und Speicherlecks wenn der Aufrufer der Funktion vergisst diesen Speicherbereich danach wieder freizugeben, aber dies ist die einzige multithreading safe Variante).

Es ist wahr dass selbst bei relativ trivialen Funktionen eine WrapperDLL oftmals Vorteile bietet da man das eigentliche API mittels C Syntax ansprechen kann und das LabVIEW API so gestalten kann dass es LabVIEW freundlich ist. Man muss dabei aber C verstehen und was man niemals vergessen sollte, um das Call Library node Interface wirklich benützen zu können ausser für triviale C Funktionen, ist diese Kenntnis effektiv ebenfalls nötig. Überspitzt gesagt ist die Call Library Node für jemanden der keine Wrapper DLL machen kann nicht das richtige Spielzeug!

Da Du immer nur Bilder der VIs angehängt hast musste ich mich darauf beschränken zu vermuten was Du falsch gemacht hast und konnte ich Dir nur allgemeine Hilfestellungen bieten. Ein Bild sagt mehr dann tausend Woirte ist zwar wahr, aber gerade im Fall der Call Library Node enthält es nur einen Bruchteil der relevanten Informationen. Denn die Parameterkonfiguration ist darin nur sehr grob ersichtlich aber die feineren Details bestimmen gerade hier ob es funktioniert, nichts tut oder ganz einfach kracht und LabVIEW mit einer allgemeinen Schutzverletzung zum Speicher rauswirft.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Variant Datentyp bei C++ dll BastiFantasti 1 5.627 10.02.2012 21:30
Letzter Beitrag: rolfk
  Erzeugte DLL hat geänderten Datentyp (uint32->int32) LabVIEWDompteur 4 6.592 14.10.2011 12:09
Letzter Beitrag: rolfk
  Datentyp HANDLE, PVOID weschi 7 11.174 12.06.2007 14:14
Letzter Beitrag: rolfk

Gehe zu: