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 

Probleme mit Handler und Struct



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!

16.11.2012, 09:57
Beitrag #1

ElBartscho Offline
CLAD


Beiträge: 9
Registriert seit: Nov 2012

2014SP1
2009
DE


Deutschland
Probleme mit Handler und Struct
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!


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.11.2012, 11:08
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Probleme mit Handler und Struct
(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.

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
16.11.2012, 14:38 (Dieser Beitrag wurde zuletzt bearbeitet: 16.11.2012 14:39 von ElBartscho.)
Beitrag #3

ElBartscho Offline
CLAD


Beiträge: 9
Registriert seit: Nov 2012

2014SP1
2009
DE


Deutschland
RE: Probleme mit Handler und Struct
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


Angehängte Datei(en) Thumbnail(s)
       
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.11.2012, 19:35
Beitrag #4

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Probleme mit Handler und Struct
(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.

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  C-Funktion benötigt Struct Forest 3 6.911 04.05.2013 23:38
Letzter Beitrag: rolfk
  Problem bei Struct Einbindung wie in C/C++ raverel 5 8.775 24.04.2013 14:22
Letzter Beitrag: raverel
  DLL-Einbindung, Struct mit verschiedenen Datentypen als Pointer übergeben hawk72 4 11.070 11.05.2012 14:41
Letzter Beitrag: hawk72
  in LV auf dll union zugreifen (struct {union{array;struct{ };BYTE}) Dommas 2 6.874 14.06.2011 10:20
Letzter Beitrag: Dommas
  Übergabe eines struct arrays an eine DDL und wieder Auslesen SK-AC 4 7.227 12.08.2010 17:01
Letzter Beitrag: rolfk
  pointer auf struct mit unterschiedlichen datentypen neven 8 7.791 27.11.2007 16:42
Letzter Beitrag: neven

Gehe zu: