LabVIEWForum.de
Dll erstellen - void* als Funktion-Ausgabewert - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Dll erstellen - void* als Funktion-Ausgabewert (/Thread-Dll-erstellen-void-als-Funktion-Ausgabewert)



Dll erstellen - void* als Funktion-Ausgabewert - Wujaszek - 15.05.2014 08:19

Hallo,

ich möchte meinem LabView-Code in dll packen. Das dll soll von externen Programm als plugin
aufgerufen werden. Die Schnittstelle ist fest definiert, und ich brauche in meinem dll u.a. die
Funktion:

void* getdata(int* size)

Leider geht bei Prototyp-Konfiguration nicht void* als Ausgabewert.
Mögliche Lösungen?


RE: Dll erstellen - void* als Funktion-Ausgabewert - GerdW - 15.05.2014 08:43

Hallo Wujaszek,

Zitat:Leider geht bei Prototyp-Konfiguration nicht void* als Ausgabewert.
Mögliche Lösungen?
Die übliche Vorgehensweise ist die Rückgabe eines Fehlercodes. So hat man immer einen I32/U32-Rückgabewert! Ob man den jetzt auch auswertet oder ob dieser überhaupt sinnvolle Werte enthalten muss, steht auf einem anderen Blatt…

Habe gerade nochmal "void*" nachgelesen:
Gib doch einfach ein Array of U8 zurück. Das ist typisiert, kann aber auch alles mögliche enthalten…


RE: Dll erstellen - void* als Funktion-Ausgabewert - rolfk - 15.05.2014 10:17

(15.05.2014 08:19 )Wujaszek schrieb:  Hallo,

ich möchte meinem LabView-Code in dll packen. Das dll soll von externen Programm als plugin
aufgerufen werden. Die Schnittstelle ist fest definiert, und ich brauche in meinem dll u.a. die
Funktion:

void* getdata(int* size)

Leider geht bei Prototyp-Konfiguration nicht void* als Ausgabewert.
Mögliche Lösungen?

Das musst Du als pointer-sized Integer konfigurieren. Ich nehme an dass in *size nach dem Aufruf der Funktion dann die Länge des Buffers angegeben ist (in Bytes, Words, Longs, Birnen oder Äpfeln? Big Grin) und dann brauchst Du nur noch einen entsprechenden Buffer in LabVIEW anzulegen (Initialize Array) und dann mit der MoveBlock() Manager-Funktion die Daten von diesem Pointerbuffer in den von Dir angelegeten LabVIEW Buffer zu kopieren.

Die Dokumentation sollte sich auch noch darüber auslassen ob man den Pointer der diese Funktion zurückgibt auch noch irgendwie deallozieren muss.
(15.05.2014 08:43 )GerdW schrieb:  Hallo Wujaszek,

Zitat:Leider geht bei Prototyp-Konfiguration nicht void* als Ausgabewert.
Mögliche Lösungen?
Die übliche Vorgehensweise ist die Rückgabe eines Fehlercodes. So hat man immer einen I32/U32-Rückgabewert! Ob man den jetzt auch auswertet oder ob dieser überhaupt sinnvolle Werte enthalten muss, steht auf einem anderen Blatt…

Habe gerade nochmal "void*" nachgelesen:
Gib doch einfach ein Array of U8 zurück. Das ist typisiert, kann aber auch alles mögliche enthalten…

Array of U8 ist nicht möglich als Returnwert einer Funktion, da LabVIEW keinerlei Möglichkeit hat festzustellen wie gross der Buffer ist der da zurückgegeben wird. Konfiguration als C-String is wahrscheinlich keine Option da LabVIEW dann nach dem Aufruf der Funktion den Buffer nach einem NULL Byte scant um dann einen entsprechenden LabVIEW String zu allozieren und die Information im Buffer in diesen String zu kopieren. Wenn der Buffer aber Binärdaten enthält wird der meist aber mehrere gültige NULL Bytes enthalten.