(06.05.2012 21:02 )hawk72 schrieb: Hallo Labview-Gemeinde,
ich habe hier ein "kleines" Problem mit der Einbindung einer DLL-Datei, welche einen struct aus verschiedenen Datentypen als Pointer übergeben haben möchte. Habe mir schon die ähnlichen Beispiele hier angeschaut und auch einige Werte, die ohne Umwege über Pointer, durch die DLL ausgegeben werden können, erfolgreich auslesen können (Status, Dll-Version, Anzahl Geräte).
Es macht z.Z. einfach nicht klick und ich stochere doch etwas im Dunkeln.
Mich interessieren hauptsächlich die Daten des t_DeviceData structs.
t_DeviceInfo wäre auch hilfreich aber eher zum Verständniss bzw. zum Gerätecheck
Nachfolgend habe ich die vorhandenen Daten eingefügt:
// --------------------------------------
// Struktur fuer Gereate-Infos (USB-HID)
// --------------------------------------
typedef struct
{
DWORD idx; // USB-Geraete-Index
int open; // Zustand -> Open=1 / Close=0
char vid_pid[256]; // VID/PID-String
char dev_info[256]; // GeraeteInfo-String
char sn_info[256]; // S/N-String
int hw_info; // HW-Info (5xxx)
unsigned char hw_var; // HW-Variante
int fw_vers; // FW-Version
} t_DeviceInfo;
// --------------------------------------
// Struktur fuer Messwerte eines Geraetes
// --------------------------------------
typedef struct
{
unsigned char me; // Masseinheit (0...x) - siehe oben
float brutto; // Brutto-Sring
float netto; // Netto-Sring
float tara; // Tara-Sring
float min; // Min-Sring
float max; // Max-Sring
unsigned char dec; // Anzahl Nachkommastellen
unsigned char status; // Status-Byte
} t_DeviceData;
//---
// --------------------------------------
// Funktions-Prototypen der DLL
// --------------------------------------
extern "C" DLL_API int Init(void);
extern "C" DLL_API int Search(t_DeviceInfo *p_dev_info);
extern "C" DLL_API int Open(int list_idx);
extern "C" DLL_API int Close(int list_idx);
extern "C" DLL_API int ReadData(int list_idx, t_DeviceData *dev_dat);
extern "C" DLL_API int Null(int list_idx);
extern "C" DLL_API int GrossNet(int list_idx);
extern "C" DLL_API int ChangeUnit(int list_idx);
extern "C" DLL_API int ChangeRange(int list_idx);
extern "C" DLL_API int Reset(int list_idx);
extern "C" DLL_API int DLLVersion(void);
//---
____________________________________________________________
Das Lesen der aktuellen Messwerte erfolgt über die Funktion:
int ReadData(int list_idx, t_DeviceData *dev_dat);
list_idx - ist eine int16 Wert mit der Nr. des Meßgerätes (hier 1)
Ich gehe mal davon aus dass es sich hier NICHT um eine Windows 3.1 DLL handelt und dann ist int doch echt ein 32 Bit Integer. Sorry!
Zitat:t_DeviceDate - ist die Struktur (siehe struct oben)
*dev_dat - der Pointer
Ich scheitere einfach an der Übergabe der Struktur als Pointer.
Die Structur habe ich in einem Cluster abgelegt bestehend aus:
(U8,double,double,double,double,double,U8,U8)
Vielleicht kann mir jemand einen Tip geben ob dies soweit korrekt ist und
wie die Sache mit dem Pointer zu realisieren ist.
Ganz einfach den Parameter als Adapt To Type konfigurieren und den Cluster anschliessen.
Aber!!! LabVIEW Cluster sind immer Byte Packed in 32 Bit Windows. Deine Struktur ist wahrscheinlich default aligned was bei MS Visual C 8 Byte ist. Das heisst die Struktur sollte zwischen Deinem ersten U8 und dem ersten double auch noch 7 dummy filler chars haben.
Und nein, die DeviceInfo Struktur ist leider wesentlich weniger einfach zu machen, obwohl auch das geht.