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!
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
Anzeige
27.04.2010, 18:55 (Dieser Beitrag wurde zuletzt bearbeitet: 27.04.2010 18:57 von rolfk.)
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.
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
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!)
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
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.