hallo zusammen, ich bitte um verständnis für eine (für euch LV User) einfache frage. ich beschäftige mich im moment mit dem aufruf externer bibliotheken, dass heißt ich habe eine dll mit funktionen, wobei viele funktionen pointer beinhalten. beispeil: BOOL PCUS11 GetKonfig (HANDLE hDevice, OUT_READ_KONFIG* pStructKonfig,ULONG* pSimpleStatus).
danach folgt die struktur typedef struct_OUT_READ_KONFIG {...}. ich möchte jetzt gerne auf die struktur zugreifen, bzw. werte aus der struktur auslesen. wie mache ich das? ich habe den knoten zum aufruf externer bibliotheken gefunden und mit der dll verknüpft. dann habe ich den funktionsname ausgewählt... wie kann ich jetzt den pointer auf die struktur zeigen lassen und die werte an den jeweiligen adressen ausgeben. habe schon überall gesucht, einschließlich LV hilfe, aber irgendwie die sache nicht ganz verstanden. wäre nett wenn ihr mir helfen könntet...
mfg
dennis
schreib "IchSelbst" mal ne PN, der macht dafür grade ein Tutorial...glaub ich jedenfalls...ist nicht trivial...besonders das mit den Pointern!
...aber ehrlich gesagt hab ich davon keinen Schimmer
' schrieb:hallo zusammen, ich bitte um verständnis für eine (für euch LV User) einfache frage.
Das ist keine einfache Frage - Pointer auf Anwenderebene und LV schließt sich eigentlich aus.
Zitat:BOOL PCUS11 GetKonfig (HANDLE hDevice, OUT_READ_KONFIG* pStructKonfig,ULONG* pSimpleStatus).
Neuesten Erkenntnissen zu folge könnte das doch gehen. Möglicherweise mit Aufwand und nur in eine Richtung, aber immerhin. Da muss ich aber selbst noch kucken.
Hier steht, wie man Daten mittels des move()-Befehls kopiert. Das resultierende U8-Array kann man dann manuell in einen Cluster (=> Struct) wandeln. Das ist zwar Aufwand, aber es geht. Und
hier steht noch viel mehr. Ich glaube ich hab' da beim Überfliegen auch was über Struct gesehen.
' schrieb:ist nicht trivial...besonders das mit den Pointern!
Genau so ist es. Wie soll ich in einem Totorial einen Sachverhalt erklären, den manche nicht mal bei einer direkten Ansprache Auge in Auge verstehen.
Zitat:...aber ehrlich gesagt hab ich davon keinen Schimmer
Das macht auch überhaupt nichts. Das Problem liegt an LV.
Pointer auf Anwenderebene in LV (und das gilt heutezutage für C++ und Delphi eigentlich genauso) sind so ungefähr genau so "schlimm", als wenn du Globale Variablen zum Datentransport benutzt anstelle von Queues. Oder Lokale Variablen zum Speichern anstelle von Schieberegistern. Oder BD schreibst vier Bildschirme breit anstelle SubVIs. Oder, oder, oder... Nur: was willst du machen, wenn du eben diese Vorgaben hast: LV und Pointer.
' schrieb:Und hier steht noch viel mehr.
Unbrauchbar für jemanden, der nur eine vorgegebene DLL einbinden will.
Aber ich hab's noch nicht aufgegeben.
Zitat:<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>BOOL PCUS11 GetKonfig (HANDLE hDevice, OUT_READ_KONFIG* pStructKonfig,ULONG* pSimpleStatus)</div>
Hallo,
also beim Knoten zum Aufruf... musst Du zunächst mal die einzelnen Parameter der Funktion angeben (hier deren 3).
HANDLE ist soweit ich weiß erstmal ein Zeiger auf eine Speicherzelle (solltest Du von einem vorhergehenden DLL Aufruf erhalten haben?).
Sie letzten beiden sind einfache Zeiger - das sollte kein größeres Problem werden.
Am einfachsten geht der letzte Parameter: Da als Typ Numerisch, U32 und "Zeiger auf Wert" verwenden.
Bei dem Zeiger auf die Struktur: Typ Array, U8, "Array Datenzeiger" verwenden. Dann musst Du unbedingt in den zu diesem Parameter gehörenden Eingang des DLL-Knotens ein initialisiertes U8 Array hineinführen, das mindestens so lang wie die Größe der Struktur in Bytes ist. Damit bekommst Du die Daten Deiner Struktur als Byte-Array. Nun musst Du "nur" noch die einzelnen Bytes je nach verwendeten Datentypen in der Struktur interpretieren.
Beispiel:
Deine Struktur besteht aus folgenden Werten (in dieser Reihenfolge)
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
typedef struct myStruct
{
unsigned int value1; //32 Bit
unsigned long long value2; //64 Bit
} myStruct;
</div>
Dann muss das initialisierte Array am Eingang des DLL-Knotens eine Größe von 4+8 = 12 Byte (U8-Elementen) haben. Aus den Daten, die aus Deiner DLL rauskommen, machst Du aus den ersten 4 Bytes einen U32 Wert und aus den nächsten 8 einen U64 Wert:
[
attachment=5896]
//edit: Ach ja. Den Handle Wert würde ich mal als U32 Wert (nicht Zeiger!) übergeben...
vielen dank... das hat mir alles schon weitergeholfen.. so ähnlich hatte ich es mir auch gedacht. vielen danke dafür... bin jedoch zur zeit mit was anderem beschäfitigt und probiere es später aus... aber vielen dank an allen
gruss dennis