LabVIEWForum.de
DLL als Wrapperfunktion - 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 als Wrapperfunktion (/Thread-DLL-als-Wrapperfunktion)

Seiten: 1 2


DLL als Wrapperfunktion - Honeygirl24 - 27.04.2010 16:18

Hallo,

ich beschäftige mich derzeit mit folgendem Problem...
Nachdem ich eine fertige DLL (in C geschrieben, C-Code unbekannt, aus Headerdateien Funktionen mit den Parametern sichtbar) in LabVIEW über die Funktion "Importieren" eingfügt habe, stellte ich fest, dass sich einige komplexe Funktionen
in der DLL nicht konvertieren ließen...
Bis jetzt habe ich rausgefunden, dass ich neben der DLL und den Headerdateien zusätzlich eine Wrapper-DLL schreiben muss.
Vorallem geht es um z.B um diese Funktion

..........

typedef struct __Object * testRef;

typedef testRef var1Ref;
typedef testRef var2Ref;

unsigned int retain(Ref testRef);


Mehr ist mir über über dieses Struct nicht bekannt...

Wie schreibe ich hierzu die Wrapperfunktion, dass die Konvertierung in LabVIEW eingebaut werden kann. Wie binde ich sie an?

Für jede hilfreiche Antwort wäre ich sehr dankbar


Grüßle,

honey


DLL als Wrapperfunktion - rolfk - 27.04.2010 18:55

' schrieb:Hallo,

typedef struct __Object * testRef;

typedef testRef var1Ref;
typedef testRef var2Ref;

unsigned int retain(Ref testRef);
Mehr ist mir über über dieses Struct nicht bekannt...

Also da ist wohl etwas falsch gegangen beim übertragen. Wohl normalerweise ein Delphi Programmierer? Wink

In C würde der Funktionsprototyp wohl eher so aussehen:

unsigned int retain(testRef <irgend ein Name>);

Da ist der Datentyp zuerst, anders als bei Delphi/Pascal.

Da dies ein Pointer auf eine opaque (also ungekannte) Datenstruktur ist, brauchst Du dafür nicht unbedingt einen Wrapper in LabVIEW. Du behandelst diese Variable in der LabVIEW Call Library Node ganz einfach als Pointer-Sized Integer, et voila.

Der Import Library Wizard kann nicht wirklich wissen was er machen muss, da testRef eine sogenannte unbeendete Datentypdeklaration ist. Ein C Compiler lässt das grundsätzlich zu, aber natürlich kann man mit dem Parameter selber nichts machen. Meist wird das verwendet um eine Struktur ausserhalb der eigentlichen Funktion als opaquen (also unbestimmten) Datentypen zu verwenden, sodass Benützer dieser Funktion keinerlei Annahmen über den Inhalt machen können, die bei späteren Versionen Kompatibilitätsprobleme verursachen können. In diesem Fall kann man nämlich innerhalb der Library bei neuen Versionen diese Struktur beliebig anpassen ohne dass eventuelle Benützer dieser Library plötzlich ins Blaue greifen, weil sie auf bestimmte Informationen in der Struktur an einem bestimmten Offset zugreifen wollen.


DLL als Wrapperfunktion - Honeygirl24 - 28.04.2010 07:19

Hallo,

ich habe mich da wohl nur verschrieben:)Der Code soll schon in C sein.

Vielan dank für den HinweisSmile
Nur es geht nur über "Instance Data Pointer"

vlg
honey


DLL als Wrapperfunktion - rolfk - 28.04.2010 07:49

' schrieb:Hallo,

ich habe mich da wohl nur verschrieben:)Der Code soll schon in C sein.

Vielan dank für den HinweisSmile
Nur es geht nur über "Instance Data Pointer"

vlg
honey

Nein, nein!!!! InstanceDataPointer is ein spezieller Pointer der per Call Library Node von LabVIEW gemanaged wird und im Zusammenhang mit den "Callback Functions" auf dem seperaten Tab gebraucht werden kann. Ich habe Callback Functions in Anführungszeichen gesetzt weil das meiner Meinung nach ein völlig falscher Name für diese Funktionen ist. Es hat mehr etwas mit "Mangement" zu tun dann mit "Callbacks" aber das ist eine andere Sache die hier nicht wirklich von Interesse ist.

Wenn Du keine Pointer sized Integer Datentypen in der Call Library Node Konfiguration hast verwendest Du eine ältere LabVIEW Version vor 8.6. Dann musst Du Dir damit behelfen dass Du einen 32 Bit Integer wählst. Das funktioniert auch (in LabVIEW 32 Bit) aber ist nicht portable wenn Du Deinen LabVIEW Source Code jemals nach LabVIEW 64 Bit portierst und müsste dannzumal in jeder Call Library Node manual angepasst werden (aber um das zu tun müsste die DLL dann auch 64 Bit compiliert sein!)


DLL als Wrapperfunktion - Honeygirl24 - 28.04.2010 07:55

Hallo,

ich arbeite bereits mit 8.9 Version. Du meinst doch "pointer to value" oder verstehe ich das falsch?

lg


DLL als Wrapperfunktion - Honeygirl24 - 28.04.2010 08:02

Ok ich habe es vestanden, war nur zu blind den Datentypen zu sehen. Ich hoffe mal dass das so klappt. Wär suppi


DLL als Wrapperfunktion - Honeygirl24 - 28.04.2010 11:42

Hallo nochmal,

also soweit so gut läuft es so, wie ich es möchte.
Nur ich habe jetzt folgendes Problem:

Folgende Funktion möchte ich in LabVIEW einbinden:

unsigned int getDeviceInfo(Ref inRef, DeviceInfo *outInfo);

Nun dieses "outInfo" ist ein Zeiger auf ein struct

typedef struct test
{
char name[20];
char descr[100];
unsigned int res;
} DeviceInfo;

Das krieg ich aus der Funktion raus...Wie handele ich das, damit dies in LabVIEW angezeigt wird?? Ein kleines Example Code wäre sehr hilfreich...


vlg
honey


DLL als Wrapperfunktion - dimitri84 - 28.04.2010 12:37

[attachment=26055] +[attachment=26056] = Wrapper?


DLL als Wrapperfunktion - rolfk - 28.04.2010 12:42

' schrieb:Hallo nochmal,

also soweit so gut läuft es so, wie ich es möchte.
Nur ich habe jetzt folgendes Problem:

Folgende Funktion möchte ich in LabVIEW einbinden:

unsigned int getDeviceInfo(Ref inRef, DeviceInfo *outInfo);

Nun dieses "outInfo" ist ein Zeiger auf ein struct

typedef struct test
{
char name[20];
char descr[100];
unsigned int res;
} DeviceInfo;

Das krieg ich aus der Funktion raus...Wie handele ich das, damit dies in LabVIEW angezeigt wird?? Ein kleines Example Code wäre sehr hilfreich...
vlg
honey

Sorry bin geizig mit Examples die ich erst noch erstellen muss Wink

Grundsätzlich wird da nichts von der Funktion zurückgegeben, zumindest was den Buffer selber angeht. Den muss der Aufrufer bereitstellen (hier also Dein LabVIEW Diagramm) und dann füllt die Funktion Informationen hinein.

Da die Strings in Deiner Struktur fixed size sind werden sie vom C Compiler inlined in die Struktur plaziert und nicht etwa als Pointer. Man kann also in LabVIEW eine Struktur (ähem Cluster) bauen, der dieser Struktur entspricht.

Das geht so dass man innerhalb des Clusters weitere Cluster plaziert von unsigned 8Bit Zahlen. Da 20 und 100 Elemente etwas lästig sind um mit Copy und Paste in eine Struktur zu plazieren machen wir das lieber anders.

Man nimmt ein Byte Array führt es durch die Array to Cluster Funktion und konfiguriert diese Funktion durch eine Rechtsmausklick um die gewünschte Anzahl Element im Cluster zu erzeugen. Dann Bundled man diese Cluster und weitere Informationen zusammen, konfiguriert den entsprechenden Parameter als Adapt To Type und alles ist schon in Butter.

Also ich bin mal nicht so und habe ein Bild des Diagramms angehängt. Wenn Du das selber einmal gebaut hast weisst Du wie es geht. Rolleyes

[attachment=26057]


DLL als Wrapperfunktion - Honeygirl24 - 28.04.2010 12:55

' schrieb:[attachment=54606:wrap.jpg] +[attachment=54607:Rapper.jpg] = Wrapper?


ich weiß nicht, was diese bildliche Darstellung bedeuten soll?? Ich dachte das ist ein Forum...