LabVIEWForum.de
Probleme mit Handler und Struct - 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: Probleme mit Handler und Struct (/Thread-Probleme-mit-Handler-und-Struct)



Probleme mit Handler und Struct - ElBartscho - 16.11.2012 09:57

Hallo Liebe Leute,

ich habe einige Probleme mit folgender DLL Funktion:

Code:
LMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID,
                                        unsigned short usPID,
                                        LPGUID lpGUID,
                                        BOOL *pbDriverInstalled);

Die beiden us- und der BOOL-Parameter machen keine Probleme. Der Rest schon.

Hier ein Ausschnitt aus dem Headerfil mit den notwendigen typedefs:

Code:
typedef unsigned char UCHAR, *PUCHAR;

typedef unsigned short USHORT, *PUSHORT;

typedef struct {

    unsigned long Data1;
  
    unsigned short Data2;

    unsigned short Data3;
  
    byte Data4[8];

} GUID;

typedef GUID *LPGUID;

typedef void *LMUSB_HANDLE;

Ich habe die Funktion mit Hilfe des Wizzards erstellen lassen. Im Wizzard wird mit für den Parameter
Code:
LPGUID lpGUID
ein Cluster angezeigt. Allerdings ist das Cluster nicht im vi vorhanden wenn ich nach der Erstellung das Blockdiagramm ansehe. Die Datentypen des Structs sind vom Wizzard lediglich einzeln an den Call Function Node Block angeschlossen worden? MIt diesen Konfigurationen erhielt ich einen Fehler von LV(#1097). Ich habe das vom Wizzard erstellte VI dann so editiert, dass die lpGUID als einzelner Parameter also in Form eines Clusters angeschlossen werden kann. Die vom Wizzard erstellten Datentypen habe ich beibehalten.

Ich bekomme hiermit zumindest keinen Fehler. Ich bekomme allerdings eine NULL als return Value. Meine Vermutung ist, dass die GUID nicht richtig erkannt oder übergeben wird?
Sind die Datentypen für Handler und die Übergabe der Parameter im richtigen Format für LabVIEW? Oder muss ich Vielleicht sogar komplett anders vorgehen um die richtige Funktionalität zu erhalten.


Danke für eure Hilfe!


RE: Probleme mit Handler und Struct - rolfk - 16.11.2012 11:08

(16.11.2012 09:57 )ElBartscho schrieb:  Hallo Liebe Leute,

ich habe einige Probleme mit folgender DLL Funktion:

Code:
LMUSB_HANDLE __stdcall InitializeDevice(unsigned short usVID,
                                        unsigned short usPID,
                                        LPGUID lpGUID,
                                        BOOL *pbDriverInstalled);

Die beiden us- und der BOOL-Parameter machen keine Probleme. Der Rest schon.

Hier ein Ausschnitt aus dem Headerfil mit den notwendigen typedefs:

Code:
typedef unsigned char UCHAR, *PUCHAR;

typedef unsigned short USHORT, *PUSHORT;

typedef struct {

    unsigned long Data1;
  
    unsigned short Data2;

    unsigned short Data3;
  
    byte Data4[8];

} GUID;

typedef GUID *LPGUID;

typedef void *LMUSB_HANDLE;

Ich habe die Funktion mit Hilfe des Wizzards erstellen lassen. Im Wizzard wird mit für den Parameter
Code:
LPGUID lpGUID
ein Cluster angezeigt. Allerdings ist das Cluster nicht im vi vorhanden wenn ich nach der Erstellung das Blockdiagramm ansehe. Die Datentypen des Structs sind vom Wizzard lediglich einzeln an den Call Function Node Block angeschlossen worden? MIt diesen Konfigurationen erhielt ich einen Fehler von LV(#1097). Ich habe das vom Wizzard erstellte VI dann so editiert, dass die lpGUID als einzelner Parameter also in Form eines Clusters angeschlossen werden kann. Die vom Wizzard erstellten Datentypen habe ich beibehalten.

Ich bekomme hiermit zumindest keinen Fehler. Ich bekomme allerdings eine NULL als return Value. Meine Vermutung ist, dass die GUID nicht richtig erkannt oder übergeben wird?
Sind die Datentypen für Handler und die Übergabe der Parameter im richtigen Format für LabVIEW? Oder muss ich Vielleicht sogar komplett anders vorgehen um die richtige Funktionalität zu erhalten.


Danke für eure Hilfe!

Du kannst die acht Bytes am Ende nicht als String definieren sondern musst sie als acht seperate Byte Controls in den Cluster plazieren.


RE: Probleme mit Handler und Struct - ElBartscho - 16.11.2012 14:38

Hey Rolf,
vielen Dank für deine Hilfe! Es hat funktioniert wie ich es mir vorgestellt habe.

Mich würde allerdings trotzdem interessieren warum während der Ausführung des Wizards angezeigt wird, dass die Struktur richtigerweise in ein Cluster gepackt wird, jedoch wenn man das VI benutzen will kein Cluster Vorhanden ist?

Oder ist das Cluster vielleicht intern zusammengesetzt und für den Benutzer nicht sichtbar?

Ich habe es nochmal für euch nachgestellt(siehe Bilder)
1.Bild im sharedLib. Wizard
2.Bild nach Ausführung des Wizards

Wirklich eigendartig...


Grüße!

Florian


RE: Probleme mit Handler und Struct - rolfk - 16.11.2012 19:35

(16.11.2012 14:38 )ElBartscho schrieb:  Hey Rolf,
vielen Dank für deine Hilfe! Es hat funktioniert wie ich es mir vorgestellt habe.

Mich würde allerdings trotzdem interessieren warum während der Ausführung des Wizards angezeigt wird, dass die Struktur richtigerweise in ein Cluster gepackt wird, jedoch wenn man das VI benutzen will kein Cluster Vorhanden ist?

Oder ist das Cluster vielleicht intern zusammengesetzt und für den Benutzer nicht sichtbar?

Ich habe es nochmal für euch nachgestellt(siehe Bilder)
1.Bild im sharedLib. Wizard
2.Bild nach Ausführung des Wizards

Wirklich eigendartig...


Grüße!

Florian

Das ist im Prinzip schon eine Struct die der Wizard hier generiert, nur vertut er sich dabei insofern dass er denkt dass diese Struct by Value übergeben werden soll, während der Parameter doch echt ein Pointer (LP..) ist.

Structs die by Value übergeben werden, werden tatsächlich mit den einzelnen Struct Elementen auf dem Stack übergeben. Das wissen zwar nicht mal die meisten C Programmierer, aber ist halt etwas was man wissen muss wenn man die Call Library Node benützt, zusammen mit noch einigen anderen C Compiler Details, worüber ein C Programmierer normalerweise nie nachdenkt.

Der Import Library Wizard hat hier also einen Bug dass er meint dass ein LPGUID eine GUID ist die by Value übergeben wird. Scheint sowieso dass der Wizard ziemlich überarbeitet wurde, denn so ausführliche Informationen wie Deine Screenshots sie zeigen gab er früher nicht preis. Gut möglich dass sich dabei dieser Bug eingeschlichen hat.

Der Wizard ist zwar ein interessantes Tool, aber es ist ein in LabVIEW geschriebener C Syntax Parser und das kann meiner Meinung nach nie mit einem Parser wie ihn GCC hat mithalten, und selbst der vertut sich ab und zu im korrekten Parsen.