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 

DLL als Wrapperfunktion



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!

27.04.2010, 16:18
Beitrag #1

Honeygirl24 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 169
Registriert seit: Jan 2008

8.5 , 8,6 , 2009, 2010
2007
de

90461
Deutschland
DLL als Wrapperfunktion
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
27.04.2010, 18:55 (Dieser Beitrag wurde zuletzt bearbeitet: 27.04.2010 18:57 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL als Wrapperfunktion
' 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.

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
28.04.2010, 07:19
Beitrag #3

Honeygirl24 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 169
Registriert seit: Jan 2008

8.5 , 8,6 , 2009, 2010
2007
de

90461
Deutschland
DLL als Wrapperfunktion
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.04.2010, 07:49 (Dieser Beitrag wurde zuletzt bearbeitet: 28.04.2010 07:52 von rolfk.)
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL als Wrapperfunktion
' 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!)

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
28.04.2010, 07:55
Beitrag #5

Honeygirl24 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 169
Registriert seit: Jan 2008

8.5 , 8,6 , 2009, 2010
2007
de

90461
Deutschland
DLL als Wrapperfunktion
Hallo,

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

lg
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.04.2010, 08:02
Beitrag #6

Honeygirl24 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 169
Registriert seit: Jan 2008

8.5 , 8,6 , 2009, 2010
2007
de

90461
Deutschland
DLL als Wrapperfunktion
Ok ich habe es vestanden, war nur zu blind den Datentypen zu sehen. Ich hoffe mal dass das so klappt. Wär suppi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.04.2010, 11:42
Beitrag #7

Honeygirl24 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 169
Registriert seit: Jan 2008

8.5 , 8,6 , 2009, 2010
2007
de

90461
Deutschland
DLL als Wrapperfunktion
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.04.2010, 12:37
Beitrag #8

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
DLL als Wrapperfunktion
    +     = Wrapper?

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
28.04.2010, 12:42
Beitrag #9

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL als Wrapperfunktion
' 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

   

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
28.04.2010, 12:55
Beitrag #10

Honeygirl24 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 169
Registriert seit: Jan 2008

8.5 , 8,6 , 2009, 2010
2007
de

90461
Deutschland
DLL als Wrapperfunktion
' 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...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Gehe zu: