27.04.2010, 16:18
Beitrag #1
|
Honeygirl24
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
|
|
|
27.04.2010, 18:55
(Dieser Beitrag wurde zuletzt bearbeitet: 27.04.2010 18:57 von rolfk.)
Beitrag #2
|
rolfk
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?
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.
|
|
|
28.04.2010, 07:19
Beitrag #3
|
Honeygirl24
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 Hinweis
Nur es geht nur über "Instance Data Pointer"
vlg
honey
|
|
|
28.04.2010, 07:55
Beitrag #5
|
Honeygirl24
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
|
|
|
28.04.2010, 08:02
Beitrag #6
|
Honeygirl24
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
|
|
|
28.04.2010, 11:42
Beitrag #7
|
Honeygirl24
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
|
|
|
28.04.2010, 12:37
Beitrag #8
|
|
|
28.04.2010, 12:55
|
Honeygirl24
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...
|
|
|
| |