LabVIEWForum.de - Hilfe zu Typedef bei dll

LabVIEWForum.de

Normale Version: Hilfe zu Typedef bei dll
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,
ich möchte in LabVIEW eine dll einbinden.
Fuer einfache Sachen habe ich das auch schon hinbekommen (so etwas wie Integer oder Strings übergeben / lesen)
Nun habe ich eine dll bei der ich einen Aufruf machen will, und zwar:

alsnCall(char *fullDeviceNameAndProperty,DTYPE *dout,DTYPE *din,short access,double *dTimeStamp)
als functionsaufruf von XYZ.dll
DTYPE ist ein Struct, und sieht so aus:

typedef struct
{
UINT32 dArrayLength;
short dFormat;
short xferReason;
int dStamp;
int sysStamp;
double dTimeStamp;
char dTag[TAG_NAME_SIZE]; // 16-chars
DUNION data;
} DTYPE;

wobei ein DUNION so aussieht:

typedef union
{
void *vptr;
char *cptr;
UINT8 *bptr;
SINT16 *sptr;
UINT16 *usptr;
SINT32 *lptr;
UINT32 *ulptr;
float *fptr;
double *dptr;
} DUNION;

Wie würde hierfür der LabVIEW- Code aussehen?
Kann ich mir in LabVIEW typedef´s basteln und sie dann irgendwie TypCast`en??
Ich dachte mir eine typedef ist ja eigentlich nichts anderes als ein Cluster, oder??
Könnte ich mir dann nicht so etwas als stricttzpe von LabVIEW bauen und dann an die dll übergeben?
Ich hoffe einer von Euch Cracks kann mir ein wenig Erleuchtung geben.
Gibt es irgendwo etwas wie eine Anleitung oder kann mir jemand o.g. Code in LabVIEW übersetzen (LV 8).
Mit freundlichen Grüßen
Ruediger
' schrieb:Hallo,
ich möchte in LabVIEW eine dll einbinden.
Fuer einfache Sachen habe ich das auch schon hinbekommen (so etwas wie Integer oder Strings übergeben / lesen)
Nun habe ich eine dll bei der ich einen Aufruf machen will, und zwar:

alsnCall(char *fullDeviceNameAndProperty,DTYPE *dout,DTYPE *din,short access,double *dTimeStamp)
als functionsaufruf von XYZ.dll
DTYPE ist ein Struct, und sieht so aus:

typedef struct
{
UINT32 dArrayLength;
short dFormat;
short xferReason;
int dStamp;
int sysStamp;
double dTimeStamp;
char dTag[TAG_NAME_SIZE]; // 16-chars
DUNION data;
} DTYPE;

wobei ein DUNION so aussieht:

typedef union
{
void *vptr;
char *cptr;
UINT8 *bptr;
SINT16 *sptr;
UINT16 *usptr;
SINT32 *lptr;
UINT32 *ulptr;
float *fptr;
double *dptr;
} DUNION;

Wie würde hierfür der LabVIEW- Code aussehen?
Kann ich mir in LabVIEW typedef´s basteln und sie dann irgendwie TypCast`en??
Ich dachte mir eine typedef ist ja eigentlich nichts anderes als ein Cluster, oder??
Könnte ich mir dann nicht so etwas als stricttzpe von LabVIEW bauen und dann an die dll übergeben?
Ich hoffe einer von Euch Cracks kann mir ein wenig Erleuchtung geben.
Gibt es irgendwo etwas wie eine Anleitung oder kann mir jemand o.g. Code in LabVIEW übersetzen (LV 8).
Mit freundlichen Grüßen
Ruediger

Ja geht im Prinzip, ausser dass Deine DUNION einen Pointer enthält und das kann LabVIEW nicht so einfach innrhalb einer Strukture/Cluster. Ohne wirklich gediegene C Kenntnisse ist da nichts zu tun und deshalb schlage ich vor gleich mit C anzufangen und eine Wrapper DLL für diese Funktion zu schreiben.

Rolf Kalbermatter
' schrieb:Ja geht im Prinzip, ausser dass Deine DUNION einen Pointer enthält und das kann LabVIEW nicht so einfach innrhalb einer Strukture/Cluster. Ohne wirklich gediegene C Kenntnisse ist da nichts zu tun und deshalb schlage ich vor gleich mit C anzufangen und eine Wrapper DLL für diese Funktion zu schreiben.

Rolf Kalbermatter

Danke Rolf,
so etwas habe ich mir schon gedacht.
Kann ich denn DTYPE direkt als Cluster an die DLL übergeben???
Ruediger
' schrieb:Danke Rolf,
so etwas habe ich mir schon gedacht.
Kann ich denn DTYPE direkt als Cluster an die DLL übergeben???
Ruediger

Nein! Weil er die DUNION enthält die NICHT direkt als LabVIEW Cluster implementierbar ist. Um das zu tun müsstest Du sehr viel, und ich meine sehr viel, low level tricks mit LabVIEW Funktionen und Aufrufen von anderen C Funktionen mittels Call Library tun. Wäre zwar möglich aber nur mit einem wirklichen sehr guten Verständnis was ein C Compiler macht wenn er Stukturen und Pointers im Speicher verwendet. Da ist es schlicht einfacher und auch mit weniger C Detailkenntnissen zu tun, um mit einem C Compiler eine Wrapper DLL zu machen die zwischen mehr LabVIEW freundlichen Datentypen und Deiner DLL übersetzt.
Und wenn Du jetzt sagst dass Du das nicht kannst weil Du C nicht gut genug kennst musst Du mir einfach glauben, dass Deine Chance um dies ohne extra Wrapper DLL zum Laufen zu bringen praktisch 0% sind.

Rolf Kalbermatter
' schrieb:Kann ich denn DTYPE direkt als Cluster an die DLL übergeben???
Ich im Gegensatz zu Rolf fang mal mit: Ja! an. Wink
Aber: Und hier kommen jetzt alle die Einwände, die Rolf schon aufgeführt hat.

Das Problem ist der eine Pointer in DUNION. LV ist nicht dafür gedacht, mit direkten Pointern zu arbeiten. Zumindest hat dieses Feature noch keiner eingebaut. Die Pointer im Funktionsaufruf sind quasi nur indirekt. Die kann ein DLL-Knoten mittels "Zeiger in Wert" auflösen. Das Problem in der Praxis liegt also daran, dass ein Pointer in einem über Pointer erreichbarem Speicherbereich liegt. Wäre DUNION ein Parameter im Aufruf, läge die Sache schon wieder anders.

Im übrigen kannst du schon einen Cluster machen und den an die DLL übergeben. Das an sich ginge schon. Es nützt nur nix wegen des Problems mit dem Union.
Referenz-URLs